1 前言
字符串比较,看起来完全一样,然后用strcmp比较,永远不相等,用var_dump查看才知道,其中一个字符多了‌看不见的特殊符号,而我长度是3。
2 样例
当你选中它,显示出来的就是人眼所见即输出的网页的,有点儿意思~
3 分析
还未发现根本原因,暂无分析~,原因在于windows复制黏贴是会在字符串最前面加入3字节的"‌"导致长度+3了,当然无法匹配通过。
做了实验,用phpstrom IDE来测试,测试数据如下:
//第一组数据,异常
$str='47ec2dd791e31e2ef2076caf64ed9b3d'
47ec2dd791e31e2ef2076caf64ed9b3d $str2
47ec2dd791e31e2ef2076caf64ed9b3d strcmp($str,$str2);
-1 $str3 = $str;
47ec2dd791e31e2ef2076caf64ed9b3d strcmp($str,$str3);
0 strcmp($str2,$str3);
1 strlen($str)
32
strlen($str2)
35 strlen($str3)
32
把上面这个code,用html查看源码,如下。发现‌很多很多...
经过测试发现规律是,如果你复制黏贴$s后面的字符串,则长度一致,如果是复制的是输出的结果,则长度会+3,正如下图的红色和绿色的路线可知。
4 解决方案
$len_sign = strlen($sign);
if($len_sign == 35){
$sign = substr($sign,3,35);
} if(strcmp($sign,$sign_server) != 0 ){
echo "invalid request errcode=4";
die();
}
5 小结
sign是32位复制或者一个字一个字敲进去的,结果到php后端会出现长度是35,然后就有此时测试实验。应该是编码问题。
然后仅作为记录使用。