2012-01-22 65 views
6

我有一个页面(index.php),它从URL中取出一个GET变量并检查它是否出于安全目的。这个GET变量只能是一个整数。我使用下面的代码来检查这一点,但在所有情况下,整数或不是,我得到index.php页面。标题从不出现。在此代码之后,页面的其余部分以html标签开始。PHP is_int未按预期执行

PHP:

<?php ob_start(); session_start(); 
$q=trim($_GET['q']); 
if (!is_numeric($q)){ 
header("HTTP/1.0 404 Not Found"); 
} 
?> 
+1

我不知道你是否已经知道了,但是你应该在'header(..)'之后添加'exit();'。否则,该脚本将继续打印出页面内容。 – laher

+0

阅读[文档](http://php.net/manual/en/function.is-int.php)会告诉你,'is_int()'检查变量的类型,所以用“'123 ''变成'is_int()'不会返回'true',因为这是字符串。你为什么用'http-status-code-404'标记你的帖子? – Tadeck

+0

@Tadeck标签已删除。谢谢你的文档。即时通讯现在使用is_numeric,它仍然没有工作 – kirby

回答

19

如果在查询字符串传递真实,不会是整数。

尝试is_numeric()

+1

也'ctype_digit()'为一个只包含数字的字符串。 – mrlee

+0

@alien我已经更新了我的当前代码,并得到了和以前一样的行为:[ – kirby

+0

尝试将'ob_start;'改为'ob_start();' – AlienWebguy

5

有一个更好的方式来做到这一点,这是铸造为int:

$q = (int) $_GET['q']; 

的is_int 表现如预期。因为GET参数总是字符串。尝试var_dumping他们。

+1

想想吧,AlienWebguy的答案可能会更好,因为你可以过滤出任何'怪异'值... – Joep

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){ 
    return (string) $value === (string) ((integer) $value); 
} 

is_int_val('33'); // true 
is_int_val('33a'); // false 
is_int_val('033'); // false 

也可以覆盖is_int()函数,使用override_function()但它仍可能在原来的版本非常有用。