最近学习URL跳转的时候新进三个超好用的PHP加密解密函数,貌似是discuz里的…使用这些加密解密的缘由是由于有时本身的URL地址被人获取之后想破解你里面传值的内容就必须知道你的key,没有key,他应该要破了一阵子才能知道你URL里面的内容吧...php
闲话少说,先将它们打包成一个文件就叫fun.php吧
<?php
function passport_encrypt($txt, $key) {
srand((double)microtime() * 1000000);
$encrypt_key = md5(rand(0, 32000));
$ctr = 0;
$tmp = '';
for($i = 0;$i < strlen($txt); $i++) {
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
}
return base64_encode(passport_key($tmp, $key));
}数组
function passport_decrypt($txt, $key) {
$txt = passport_key(base64_decode($txt), $key);
$tmp = '';
for($i = 0;$i < strlen($txt); $i++) {
$md5 = $txt[$i];
$tmp .= $txt[++$i] ^ $md5;
}
return $tmp;
}安全
function passport_key($txt, $encrypt_key) {
$encrypt_key = md5($encrypt_key);
$ctr = 0;
$tmp = '';
for($i = 0; $i < strlen($txt); $i++) {
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
$tmp .= $txt[$i] ^ $encrypt_key[$ctr++];
}
return $tmp;
}
?>
如下是一些示例…加深对这三个加密解密函数的理解…
//string.php
<?php
include “fun.php”;session
$txt = “This is a test”;
$key = “testkey”;
$encrypt = passport_encrypt($txt,$key);
$decrypt = passport_decrypt($encrypt,$key);dom
echo $txt.”<br><hr>”;
echo $encrypt.”<br><hr>”;
echo $decrypt.”<br><hr>”;
?>
//array.php
<?php
include “fun.php”;ide
$array = array(
"a" => "1",
"b" => "2",
"c" => "3",
"d" => "4"
);
//serialize产生一个可存储的值,返回一个字符串,unserialize还原
$txt = serialize($array);
$key = “testkey”;
$encrypt = passport_encrypt($txt,$key);
$decrypt = passport_decrypt($encrypt,$key);
$decryptArray = unserialize($decrypt);函数
echo $txt.”<br><hr>”;
echo $encrypt.”<br><hr>”;
echo $decrypt.”<br><hr>”;
echo $decryptArray.”<br><hr>”;
?>
关键的地方来了…当你要跳转到另一个网址,但又要保证你的session无误的时候,你须要对session做一个处理.貌似一个公司有一个网站又有一个论坛,两个地方都有注册和登陆,但又不想让用户在主页登陆后跳转到论坛的时候session失效,便是登陆一次跑完整间公司…
那要怎样来处理用户的session呢…
网页都是无状态的,若是要在新的网页中继续使用session,则须要把session从一个地方移到另外一个地方,可能有些人已经想到了,我能够经过url传址的方式来调用它….而PHP有个处理session的变量,叫$_SESSION.因而….
将须要注册的session转换成一个数组吧.那么,你能够这样写:
//login.php
<?php
session_start();
include “fun.php”;
….
$_SESSION[“userid”];
$_SESSION[“username”];
$_SESSION[“userpwd”];
…
header("Location: http://$domain/process.php?s=".urlencode(passport_encrypt(serialize($_SESSION),"sessionkey")));
?>
上例中先用serialize将$_SESSION变成可存储的数据,而后经过passport_encrypt将这个数据加密,加urlencode的缘由是由于$_SESSION加密时,有可能会产生像料想不到的编码,因此以防万一…(事实证实很是有效)
处理下先
//process.php
<?php
session_start();
include “fun.php”;
$_SESSION=unserialize(passport_decrypt($_GET["s"],"sessionkey"));
header("Location: http://$domain/index.php");
?>
先用$_GET[“s”]获取URL的参数,而后用passport_decrypt将其解密,再用unserialize将其数据还原成原始数据
到了这步处理,你的网页就可能经过header自由跳转啦….
这种方法还涉及到安全性的问题,若是你的url地址在传址的过程当中被人家获取的话,那就真的是很差意思了…人家虽然可能破解不了url里边的内容,但人家也能够直接用这个url地址来登陆你的一些我的帐户啊,邮箱账户啊甚至银行账户(固然不多人会这样写,我例外,哈哈)…听起来好怕….但其实你能够在跳转页面做取消session处理….
如下是增强版的process.php
<?php
session_start();
include_once "fun.php";
$_SESSION=unserialize(passport_decrypt($_GET["s"],"sessionkey"));
if((time()-$_SESSION["TIME"])>30){
header("Location: http://$domain/ login.php");
unset($_SESSION["USERNAME"]);
unset($_SESSION["PASSWORD"]);
}
else
header("Location: http://$domain/ index.php");
?>
写这个文件以前,你还要在登陆那边设置
$_SESSION["TIME"] = time();
设置这个的缘由主要是获取两边的时间,若是跳转的时候超过30秒的时候,你就可让它跳转到login.php登陆页面,网速慢的客户就很差意思啦…但这也预防了若是此url被人获取,而这我的又没有在30秒内登陆的话,那就很差意思啊,超时从新登陆.
$_SESSION["USERNAME"]和$_SESSION["PASSWORD"] 这两个东东就是用户登陆时须要输入的用户名和密码了….取消这两个session的缘由就是由于若是你的url被人获取了,那我的虽然在超过30秒内跳转到loign.php的页面,但那些传过来的session依然有效,只要将url后缀login.php改成index.php….那他同样登陆成功…
感受废话说了一大堆…不知让不让人明白一点...明白的就快去实践一下…学习