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.
?>
另外一种解决办法是用正则表达式验证输入内容是否合法。
欢迎光临 就爱编程论坛 (http://bbs.waibc.com/) | Powered by Discuz! X2 |