我有一个页面(index.php)从URL中获取GET
变量并检查它是否安全。此GET
变量应该只是一个整数。我使用以下代码来检查这一点,但在所有情况下,整数与否,我得到index.php页面。标题永远不会出现。在此代码之后,页面的其余部分将以html
标记开头。
PHP:
<?php ob_start(); session_start();
$q=trim($_GET['q']);
if (!is_numeric($q)){
header("HTTP/1.0 404 Not Found");
}
?>
答案 0 :(得分:21)
如果它在查询字符串中传递,它将不是整数。
尝试is_numeric()
答案 1 :(得分:5)
有一种更好的方法可以做到这一点,即转换为int:
$q = (int) $_GET['q'];
is_int 的行为符合预期。因为GET参数总是字符串。尝试var_dumping它们。
答案 2 :(得分:0)
有时您想要验证应该是数字的输入,但在$_GET
或$_POST
中,您将获得字符串。 is_numeric()
可能有问题,因为它允许十六进制,二进制和八进制格式(来自手册):
Thus +0123.45e6 is a valid numeric value. Hexadecimal (e.g. 0xf4c3b00c), Binary (e.g. 0b10100111001), Octal (e.g. 0777) notation is allowed too but only without sign, decimal and exponential part.
您不能使用is_int()
,因为它只适用于整数值(不是字符串!)所以...您可以通过这种方式验证字符串和整数的数字:
function is_int_val($value){
if( ! preg_match( '/^-?[0-9]+$/', $value ) ){
return FALSE;
}
/* Disallow leading 0 */
// cast value to string, to make index work
$value = (string) $value;
if( ( $value[0] === '-' && $value[1] == 0 ) || ( $value[0] == 0 && strlen( $value ) > 1 ) ){
return FALSE;
}
return TRUE;
}
is_int_val('33'); // true
is_int_val('33a'); // false
is_int_val('033'); // false
也可以使用override_function()覆盖is_int()函数,但它在原始版本中仍然有用。