PHP将URL地址参数进行加密传输提高网站安全性

大家在使用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

相比之下已经好一些了吧,至少看上去会好很多,那如何进行加密和解密呢?请看下面函数(不用细看,直接拿过去用就行了,重点看如果调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
//---------------以下为加密函数(复制过去就行了)-----------------
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" >

上面就是如何加密参数。再看一下如何解密接收到的参数:

1
2
3
4
$url_info  = geturl( $_SERVER [QUERY_STRING], $key_url_md_5 ); //接收所有参数
$page = $url_info [ 'page' ]; //解密对应参数
$id = $url_info [ 'id' ];
$time = $url_info [ 'time' ]; //这个是时间戳,大家可以利用这个参数判断一下链接生成的时间,就可以判断是否超时了(此项如果不需要也可以忽略)

这样我们就得到了解密的$page和$id参数了,大家试一下吧,有问题也可以联系我!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值