intval()极限 intval()可以把任何其它类型的数值转换成整型。对于初学者灵活的变量类型是PHP的一个优点。而今天这种灵活也存在着一些缺陷。我们经常使用intval()函数对URL上传来的ID号转化成整型来保证不会有黑客传递字符串。
然后在工作中我们终于发现,如下的代码存在缺陷。
./limit /intval.php 1.
<?php 2.
3.
$string = pow(2, 31) - 1; 4.
echo "string=$string"; 5.
$integer = intval($string); 6.
echo "<br/>integer=$integer"; 7.
8.
echo "<hr/>"; 9.
10.
$string = pow(2, 31); 11.
echo "string=$string"; 12.
$integer = intval($string); 13.
echo "<br/>integer=$integer"; 14.
15.
?>
对于2^31-1的数字转换前后是没有问题的,但是对于2^31-1之后的数字就会返回错误的数字,造成程序中出现意外错误。如果观察不够细致是很难发现问题的。
一种也不太好的解决办法是使用floatval()函数,但也只是上限比较高而已。
./limit/floatval.php 16.
<?php 17.
18.
$string = pow(2, 31) - 1; 19.
echo "string=$string"; 20.
$float = floatval($string); 21.
echo "<br/>float=$float"; 22.
23.
echo "<hr/>"; 24.
25.
$string = pow(2, 31); 26.
echo "string=$string"; 27.
$float = floatval($string); 28.
echo "<br/>float=$float"; 29.
30.
echo "<hr/>"; 31.
32.
$string = pow(2, 39); 33.
echo "string=$string"; 34.
$float = floatval($string); 35.
echo "<br/>float=$float"; 36.
37.
echo "<hr/>"; 38.
39.
$string = pow(2, 40); 40.
echo "string=$string"; 41.
$float = floatval($string); 42.
echo "<br/>float=$float"; 43.
44.
?> 另外一种解决办法是用正则表达式验证输入内容是否合法。
|