admin 发表于 2012-4-6 05:51:30

intval()极限

intval()极限intval()可以把任何其它类型的数值转换成整型。对于初学者灵活的变量类型是PHP的一个优点。而今天这种灵活也存在着一些缺陷。我们经常使用intval()函数对URL上传来的ID号转化成整型来保证不会有黑客传递字符串。
然后在工作中我们终于发现,如下的代码存在缺陷。
./limit /intval.php1.
<?php2.
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.php16.
<?php17.
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.
?>另外一种解决办法是用正则表达式验证输入内容是否合法。

页: [1]
查看完整版本: intval()极限