url参数加密及sql敏感操作保护

本文转自
分享如何使用PHP将URL地址参数进行加密传输提高网站安全性

本文转自
分享如何使用PHP将URL地址参数进行加密传输提高网站安全性

本文转自
分享如何使用PHP将URL地址参数进行加密传输提高网站安全性

在php应用中经常用到使用GET进行参数传递的例子,如果只是传递页码这种不太敏感的参数倒是无所谓,访客及时修改也没多大影响。 但是如果传递的是ID或者是action之类涉及到sql的敏感操作,如果访客擅自修改可能会造成意外ID记录的删除或更改,这将导致灾难性后果!(例如 http://ranjuan.cn/test.php?action=del&id=100,正常情况下test.php使用$_GET方式获取到id号后根据del进行删除操作,这个地址栏的地址是可以被人把id随便修改的)

防止这种漏洞的有效方法是对url后面的参数进行可逆加密,这样虽然还是可以修改url但是修改后的不能被预设的算法进行准确解密,也就不会执行进一步的破坏性操作了。当然为了安全起见一般php应用不建议对数据库数据进行删除操作,可以增加字段将其标记为“失效”,查询的时候只显示有效的字段的记录即可;另外也可以在执行sql操作前检查当前用户的权限以及在where语句后尽可能加上限制条件(比如数据记录有个“发表人”字段,那么可以这么写 “delete from 文章列表 where id=100 and 发表人=当前登录用户”);另外在php应用中对敏感操作最好形成日志系统,可以在delete语句前先select初始数据插入日志后再进行delete操作并将此操作记录日志里。当然有钱的企业一般都可以有足够的硬件进行增量备份、磁带备份什么的,当然他们也有专业的DBA,大神级别的有几套成熟的管理流程应对删库跑路的程序员都不在话下!

下面还是讲url地址参数加密吧,原始来源已经写在文章开头了,以下内容仅做备忘:

//---------------以下为加密函数(复制过去就行了)-----------------
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'; //可以更换为其它的加密标记,可以自由发挥
 
//---------------以上为加密函数-结束(复制过去就行了)-----------------

以上这个是关键的加密与解密函数,如果用到的地方比较多可以require或include一下。

将表单action中参数id和page进行加密并加入时间戳一起,这样每次的链接地址都是动态的,另外在test.php接收页面设置超时时间,以达到防止重复提交的目的(test.php每次被访问时获取当前时间t1,根据url解密函数获得表单提交的时间t2,如果t1==t2或 t1-t2<你设置的超时时间2秒,说明是第一次提交,否则可以判断为重复提交或刷新了url)。

?
<form?id="form1"?name="form1"?method="post"?action="test.php?<?=encrypt_url("id=1&page=5"."&time=".time(),$key_url_md_5)?>"?enctype="multipart/form-data">

上面是如何对参数进行加密的示例(action里面test.php后面只能用encrypt_url函数,不要再添加其他字符串,否则解密时使用$_SERVER[QUERY_STRING]会获取多余的信息导致解密失败))。

test.php对url传递的参数进行解密操作:

?
?
?
?
$url_info?=?geturl($_SERVER[QUERY_STRING],$key_url_md_5);//接收所有参数
$page=$url_info['page'];//解密对应参数
$id=$url_info['id'];
$time=$url_info['time'];//这个是时间戳,可以利用这个参数判断一下链接生成的时间与当前访问test.php的实际误差范围,就可以判断是否超时或重复提交了(此项如果不需要也可以忽略)

$page和$id就是解密后post提交过来的数据。

基于互联网精神,在注明出处的前提下本站文章可自由转载!

本文链接:https://ranjuan.cn/url参数加密及sql敏感操作保护/

赞赏

微信赞赏支付宝赞赏

tesseract-ocr-图片字符验证码识别-样本训练
docker安装gogs
php7-1版本下钉钉回调接口(解决undefined-function)