分享如何使用PHP将URL地址参数进行加密传输提高网站安全性
更新:2015-11-09 08:24:34
人气:19068
来源:本站原创
A+
大家在使用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参数了,大家试一下吧,有问题也可以联系我!
推荐的文章
随手记
- ● 自制(IP或域名)可信任的SSL证书,适用360、chrome等浏览器
- ● windows系统下php无法使用curl怎么办?
- ● 绿联UGREENKVM切换器(分屏器)快捷键丢失解决办法
- ● 统信UOS开机指定网址全屏启动自带浏览器以及屏蔽ALT+F4关闭
- ● xshellSSH连接Linux服务器防止超时退出
- ● php8开启OpenSSL扩展库报错disabledinstallext
- ● 统信系统linux安装php时的报错libxml-2.0>=2.7.6
- ● tidb关闭sql_mode=ONLY_FULL_GROUP_BY模式
- ● windows10如何开机自动运行bat文件
- ● Win10Mysql8初始密码丢失,初始化又不显示密码
PHP经验分享
- ● PHP批量对TCP服务端指定多个IP非阻塞检查在线状态
- ● python实现TCP服务端持续接收关机、重启指令并输出结果【系列三】
- ● PHP给TCP服务端发送指令【系列二】
- ● PHP判断TCP服务端是否在线【系列一】
- ● PHP判断远程文件是否存在
- ● LINUX下用PHP获取CPU型号、内存占用、硬盘占用等信息代码
- ● PHP代码用UDP方式远程唤醒电脑让计算机开机
- ● apache下php生成验证码图片不能显示
- ● PHP使用AES加密解密示例(无偏移)
- ● Pluginmysql_native_passwordreported:''mysql_native_password'isdeprecate问题