https://blog.csdn.net/llf369477769/article/details/51837546
大家在使用PHP进行GET或POST提交数据时,经常会在URL带着参数进行传递,比如www.mdaima.com/get.php?id=1&page=5,这里就将id编号和page页码进行了参数传递,如果这样直接明文传输,会将参数直接暴露给用户,要是是比较重要的数据这样传输我觉得还是不太安全。那如果将参数变成下面这样,是不是会好点呢?
1 | www.mdaima.com/get.php?VGsAYQ96VzkEaF08DTxTLQIyDmsBIQtnVj0Fe1ciAD0EN1M0X2MHMQYxDDcAOwI%2FXToBPVM5ADxfag%3D%3D |
---|
我们再加强一下,将get.php重命名改为get_mb.php,然后利用静态规则,把get.html映射到get_mb.php,这样即使用户试着访问get.php也无法找到真实的PHP文件了,因为真实的PHP文件不是get.php而是get_mb.php,以下是.htaccess规则设置?
1 | RewriteRule ^get.html$ get_mb.php?&%{QUERY_STRING} #.htaccess伪静态规则的设置(加入到.htaccess里就行) |
---|
利用加密再配合伪静态设置,最终效果就是下面这样了,即隐藏了真实php文件get_mb.php又将参数都加密传输了。
1 | www.mdaima.com/get.html?VGsAYQ96VzkEaF08DTxTLQIyDmsBIQtnVj0Fe1ciAD0EN1M0X2MHMQYxDDcAOwI%2FXToBPVM5ADxfag%3D%3D |
---|
相比之下已经好一些了吧,至少看上去会好很多,那如何进行加密和解密呢?请看下面函数(不用细看,直接拿过去用就行了,重点看如果调用)
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 | //---------------以下为加密函数(复制过去就行了)-----------------function keyED($txt``,$encrypt_key``){ ``$encrypt_key = md5($encrypt_key``); ``$ctr=0; `` $tmp = ""``; ``for(``$i=0;``$i<``strlen(``$txt);``$i++) `` { `` if ($ctr``==strlen``($encrypt_key``)) ``$ctr=0; `` $tmp``.= substr``($txt``,$i``,1) ^ substr``($encrypt_key``,$ctr``,1); ``$ctr++; `` } `` return $tmp; ``} function encrypt($txt``,$key``) { ``$encrypt_key = md5(mt_rand(0,100)); ``$ctr=0; `` $tmp = ""``; ``for ($i``=0;$i``<strlen``($txt``);$i``++) ``{ ``if ($ctr``==strlen``($encrypt_key``)) ``$ctr=0; `` $tmp``.=substr``($encrypt_key``,$ctr``,1) . (substr``($txt``,$i``,1) ^ substr``($encrypt_key``,$ctr``,1)); ``$ctr++; `` } `` return keyED($tmp``,$key``);} `` function decrypt($txt``,$key``){ ``$txt = keyED($txt``,$key``); ``$tmp = ""``; ``for(``$i=0;``$i<``strlen(``$txt);``$i++) `` { `` $md5 = substr``($txt``,$i``,1); ``$i++; `` $tmp``.= (substr``($txt``,$i``,1) ^ $md5``); ``} ``return $tmp;``}function encrypt_url($url``,$key``){ ``return rawurlencode(base64_encode``(encrypt($url``,$key``)));}``function decrypt_url($url``,$key``){ ``return decrypt(base64_decode``(rawurldecode($url``)),$key``);}``function geturl($str``,$key``){ ``$str = decrypt_url($str``,$key``); ``$url_array = explode``('&'``,$str``); ``if (is_array``($url_array``)) ``{ ``foreach ($url_array as $var)`` {`` $var_array = explode``("="``,$var``); ``$vars[``$var_array[0]]=``$var_array[1];`` }`` }`` return $vars;``} $key_url_md_5 = 'mdaima.com-123-scc'``; //可以更换为其它的加密标记,可以自由发挥 //---------------以上为加密函数-结束(复制过去就行了)----------------- |
---|
以上这个是关键的加密与解密函数,下面看一下如何调用,我们举例说一下将表单action中参数id和page进行加密并加入时间戳一起,这样每次的链接地址都是动态的,而且可以在接收页面设置页面限制超时的有效期了。
1 | <form id="form1" name="form1" method="post" action="?<?=encrypt_url("``id=1&page=5"."``&time=".time(),$key_url_md_5)?>" enctype="multipart/form-data"``> |
---|
上面就是如何加密参数。再看一下如何解密接收到的参数:
1234 | $url_info = geturl($_SERVER``[QUERY_STRING],$key_url_md_5``);//接收所有参数``$page=``$url_info[``'page'];``//解密对应参数$id``=$url_info``['id'``];$time``=$url_info``['time'``];//这个是时间戳,大家可以利用这个参数判断一下链接生成的时间,就可以判断是否超时了(此项如果不需要也可以忽略) |
---|
这样我们就得到了解密的\$page和\$id参数了,大家试一下吧,有问题也可以联系我!