是否有必要验证$ _GET id

时间:2013-05-08 01:59:16

标签: php html mysql pdo

我确定之前有人问过这个,但我找不到类似的帖子。

从$ _GET变量验证ID字段有多大必要? 我正在使用is_numeric()来确保我至少得到一个数字,但我只是在添加不必要的代码?

离。

www.test.com/user.php?user_id=5

if (isset($_GET['user_id']) && is_numeric($_GET['user_id'])) {
  *PDO query for user information*
}

是必需的is_numeric()吗? 是否有可能通过更改地址中的user_id进行攻击?

5 个答案:

答案 0 :(得分:2)

清理数字ID的最佳方法是使用(int)强制转换。

$id = (int) $_GET['ID'];

使用 永远不会知道的字符串。

  

is_int()是否必要?

您可能正在寻找按ID检索数据。因此,将字符串转换为int是最简单的方法。如果应用于字符串,请在旁注is_int will always return false

  

是否有可能通过更改地址中的user_id来进行攻击?

嗯,字符串总是。您永远不会知道用户可能输入的奇怪字符以及影响查询的方式。例如,我不知道在这种情况下是否可以应用它,但是,你应该看看NULL bytes attacks

答案 1 :(得分:1)

如果您不想使用预准备语句,PDO :: quote应该是正确的函数:

  

返回一个引用的字符串,理论上可以安全地传入SQL语句。

答案 2 :(得分:1)

如果要在执行查询之前正确验证整数,则应使用filter_input();结果是有效整数,false如果它不是有效整数,或null如果参数根本没有通过。

if (is_int($userId = filter_input(INPUT_GET, 'user_id', FILTER_VALIDATE_INT))) {
  *PDO query for user information*
}

如果你正在使用准备好的陈述,这真的非常重要,但是如果你想根据输入是否符合预期而返回失败回复,你可以使用上方。

答案 3 :(得分:0)

is_int不起作用,因为GET变量总是作为字符串传递。

就个人而言,我喜欢测试一个有效的整数:

if(strval(intval($_GET['user_id'])) === $_GET['user_id'])

然而,这可能是矫枉过正的。毕竟,如果你正在使用预处理语句,那么就不需要处理任何转义,并且搜索不存在的行只会返回没有结果。我会投入intval($_GET['user_id']),但只是为了让未来的编码员清楚地知道ID是一个数字。

答案 4 :(得分:0)

is_int检查变量类型。但$ _GET ['id']将始终是一个字符串。更好地使用filter_var

但你必须使用预备陈述。

P.S。使用预处理语句,您无法使用验证。 DB会告诉我没有找到任何东西。但是如果你想警告用户有关错误的请求,你必须在查询之前对其进行验证。