代码
<?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