php的url的query部分签名实现

代码

<?php



/* url请求防窜改的签名法
   只基本query部分签名,如果想考虑host与path部分请做为一个参数放到query中
   $url 是带有query部分的url,没设置第二个参数表示生成签名url,返回签名值,需要自己拼接到url中.
   $signVar url中属于签名参数名称,设置值是就是表示比较方式,返回值,成功返回 true,失败返回新的签名串,所以请使用===来比较是否成功
   注意签名只对url部分的query进行签名,所以,其它部分发生变化时,并不会影响比对结果,也就是说会认为是没被窜改,因为其它部分进行窜改请求接受方就会发生变化,就没意义.
   且会对query进行按参数名称进行排序,所以,参数的排列位置并不会影响签名结果.
   */

function urlSign ($url, $signVar = null, $pwd = '中国国是吉国这是密码串**&&#)轱辘中是地. ') {
    if (empty($url)) {//url不能为空
        exit('urlSign方法的url参数不能是空字符串');
    }
    
    $urls = parse_url($url);
    
    if (!is_array($urls)) {
        exit('urlSign方法的url参数可能是无效url字符串,解析失败:'.var_dump($urls));
    }

    if (empty($urls['query'])) {
        exit('urlSign方法的url参数url字符串没有包含query部分:'.var_dump($urls));
    }
    
    parse_str($urls['query'], $query);
    
    if (!ksort($query, SORT_STRING)) {
        exit('urlSign方法的$query排序失败:'.var_dump($urls));
    }
    
    if (is_null($signVar)) {//签名,返回签名值
        return sha1(implode($pwd, $query).$pwd.implode($pwd, array_keys($query)));
    }
    
    if (empty($query[$signVar])) {
        exit('urlSign方法的比较模式时必须指定原签名参数:'.var_dump($urls));
    }
    
    $oldSign = $query[$signVar];
    unset($query[$signVar]);
    $newSign = sha1(implode($pwd, $query).$pwd.implode($pwd, array_keys($query)));
    return $oldSign === $newSign ? true : $newSign;
}

$url = 'http://www.qq.com/?uid=123456&username=qidizi&email=qidizi@qq.com&op=i_am_ok&time=12345679';
echo "原来的url是:{$url}<br/>";
$sign = urlSign($url);
echo "原来的url签名串:{$sign}<br/>";
$url = $url.'&sign='.$sign;
echo "原来的url签名后的组成是:{$url}<br/>";
$isSame = urlSign($url, 'sign');
echo "原来的url签名后的url(附加了签名串)比较是否有人窜改结果:".var_export($isSame, 1)."<br/>";
$urlRe = str_replace('&username=qidizi', '&username=qidizi1', $url);
$isSame = urlSign($urlRe, 'sign');
echo "原来的url({$url})签名后的进行窜改后url(qidizi变成了qidizi1{$urlRe})比较是否有人窜改结果(这里输出是true时就表示一样,如果是签名串就是不一致,挨窜改了):".var_export($isSame, 1)."<br/>";
$urlRe = str_replace('http://www.qq.com/', 'http://www.qidizi.com/', $url);
$isSame = urlSign($urlRe, 'sign');
echo "原来的url({$url})签名后的进行窜改后url(域名发生了变化{$urlRe})比较是否有人窜改结果(这里输出是true时就表示一样,如果是签名串就是不一致,挨窜改了):".var_export($isSame, 1)."<br/>";


---------------------输出结果------------------




原来的url是:http://www.qq.com/?uid=123456&username=qidizi&email=qidizi@qq.com&op=i_am_ok&time=12345679
原来的url签名串:e6dc0e6a0a6cc4d08d3256af3f0c99ac1001b298
原来的url签名后的组成是:http://www.qq.com/?uid=123456&username=qidizi&email=qidizi@qq.com&op=i_am_ok&time=12345679&sign=e6dc0e6a0a6cc4d08d3256af3f0c99ac1001b298
原来的url签名后的url(附加了签名串)比较是否有人窜改结果:true
原来的url(http://www.qq.com/?uid=123456&username=qidizi&email=qidizi@qq.com&op=i_am_ok&time=12345679&sign=e6dc0e6a0a6cc4d08d3256af3f0c99ac1001b298)签名后的进行窜改后url(qidizi变成了qidizi1http://www.qq.com/?uid=123456&username=qidizi1&email=qidizi@qq.com&op=i_am_ok&time=12345679&sign=e6dc0e6a0a6cc4d08d3256af3f0c99ac1001b298)比较是否有人窜改结果(这里输出是true时就表示一样,如果是签名串就是不一致,挨窜改了):'b8a440cf70d0e2dfdd5ac92ac4a45a5cfa941e1c'
原来的url(http://www.qq.com/?uid=123456&username=qidizi&email=qidizi@qq.com&op=i_am_ok&time=12345679&sign=e6dc0e6a0a6cc4d08d3256af3f0c99ac1001b298)签名后的进行窜改后url(域名发生了变化http://www.qidizi.com/?uid=123456&username=qidizi&email=qidizi@qq.com&op=i_am_ok&time=12345679&sign=e6dc0e6a0a6cc4d08d3256af3f0c99ac1001b298)比较是否有人窜改结果(这里输出是true时就表示一样,如果是签名串就是不一致,挨窜改了):true

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值