我确定之前有人问过这个,但我找不到类似的帖子。
从$ _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进行攻击?
答案 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会告诉我没有找到任何东西。但是如果你想警告用户有关错误的请求,你必须在查询之前对其进行验证。