0

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

从 $_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 进行攻击?

4

5 回答 5

2

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

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

用你永远不知道字符串。

is_int()必要吗?

您可能正在寻找按 id 检索数据。因此,将字符串转换为 anint是最简单的方法。附带说明,如果应用于字符串,is_int 将始终返回 false 。

通过更改地址中的 user_id 是否有可能受到攻击?

好吧,字符串总是的。您永远不知道用户可能输入了哪些奇怪的字符以及这将如何影响查询。例如,我不知道它是否可以应用于这种情况,但是你应该看看NULL bytes Attacks

于 2013-05-08T02:01:52.573 回答
1

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

返回理论上可以安全地传递给 SQL 语句的带引号的字符串。

于 2013-05-08T02:02:58.610 回答
1

如果您想在执行查询之前正确验证整数,您应该使用filter_input(); 结果是一个有效的整数,false如果它不是一个有效的整数,或者null根本没有传递参数。

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

如果您使用准备好的语句,这并不重要,但如果您希望根据输入是否符合预期返回失败响应,您可以使用上面的。

于 2013-05-08T02:23:16.757 回答
0

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

但是无论如何你必须使用准备好的语句。

PS 使用准备好的语句,您不能使用验证。DB 会告诉我们什么也没找到。但是如果你想警告用户错误的请求,你必须在查询之前验证它。

于 2013-05-08T02:02:46.823 回答
0

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

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

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

但是,这可能是多余的。毕竟,如果您使用准备好的语句,则无需处理任何转义,并且搜索不存在的行将不会返回任何结果。我会加入intval($_GET['user_id']),但只是为了让未来的编码人员真正清楚地知道 ID 是一个数字。

于 2013-05-08T02:02:44.550 回答