一,strcmp
int strcmp ( string $str1 , string $str2 )
- 作用
字符串比较
如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0。 - Note
1)比较区分大小写
2)如果要安全的使用strcmp进行字符串比较,则所有参数必须都是字符串,否则结果不可预知。
二,比较原理
两个字符对应位置的字符进行依次比较。若相同,则比较下一个位置,否则返回两个字符的ascii的差值。
可以通过以下示例看出:
<?php
$str1 = "b";
echo ord($str1); //98
echo "<br/>";
$str2 = "t";
echo ord($str2); //116
echo "<br/>";
echo ord($str1)-ord($str2);//-18
$str1 = "bear";
$str2 = "tear";
$str3 = "";
echo "<pre>";
echo strcmp($str1, $str2); // -18
echo "<br/>";
echo strcmp($str2, $str1); //18
echo "<br/>";
echo strcmp($str2, $str2); //0
echo "<br/>";
echo strcmp($str2, $str3); //4
echo "<br/>";
echo strcmp($str3, $str2); //-4
echo "<br/>";
echo strcmp($str3, $str3); // 0
echo "</pre>";
?>
三,存在的安全问题
- Note
(int)strcmp('pending',array())
字符串与数组比较,在php5.2.16返回-1,在php5.3.3返回0
- 示例
<?php
$pass=@$_POST['pass'];
$pass1=***********;//被隐藏起来的密码
if(isset($pass))
{
if(@!strcmp($pass,$pass1)){
echo "flag:nctf{*}";
}else{
echo "the pass is wrong!";
}
}else{
echo "please input pass!";
}
?>
如果通过POST请求提交一个数组pass,那么将会绕过密码判断。例如pass[]=1即可。