我有一个名为ID的主键表。 ID将传递给页面,如:
testpage.php?ID=123.
如果我使用:
$sanitized_id = filter_input(INPUT_GET, 'ID', FILTER_SANITIZE_NUMBER_INT)
可以在查询中安全地使用$ sanitized_id吗?
答案 0 :(得分:2)
接近准备好了。虽然应该通过预处理语句来防止SQL注入,但仍然可能希望URL严格且干净。为此目的,你的代码是不够的。例如,FILTER_SANITIZE_NUMBER_IN
T不会删除减号。
这是我使用的一些代码。我几乎只是从我现有的项目中复制并粘贴它。我只是更改了ID并放入回声。
if (empty($_GET['ID'])) {
echo('ID is empty');
exit;
}
$sanitized_id = filter_input(INPUT_GET, 'ID', FILTER_SANITIZE_NUMBER_INT);
$sanitized_id = str_replace('-', '', $sanitized_id); //Get rid of any - signs
if (($sanitized_id != $_GET['ID']) || (strlen($sanitized_id) != strlen($_GET['ID']))) {
//strlen catches if + signs are included, I'm really strict at what I allow on the URL
echo('Invalid url');
exit;
}
echo('The sanitized ID is: ' . $sanitized_id);
答案 1 :(得分:2)
有两种非常简单的方法可以确保条目是整数:
施法:
$myInt = (int) $_GET['ID'];
使用intval()
:
$myInt = intval($_GET['ID']);
filter_input()
函数有很好的过滤器,特别用于清理电子邮件,网址或IP地址,但实际上,使用它来清理整数是过度的。
答案 2 :(得分:1)
我建议不要进行卫生处理,而是进行验证:
$id = filter_input(INPUT_GET, 'ID', FILTER_VALIDATE_INT, FILTER_NULL_ON_FAILURE);
if ($id === null) {
die("Die, evil request, die!");
}
// post: $id is a valid integer
除此之外,我仍然会去prepared statements;在这段代码中,很明显ID必须是一个有效的整数,但是一旦数据库代码与请求处理进一步分离,你就会想要一些保证。
答案 3 :(得分:1)
可以在查询中安全地使用$ sanitized_id吗?
NO。
无论输入验证与“在查询中使用数据”无关。
在设计合理的应用程序中,这些层(输入验证和数据库交互)应该是分开的,并且相互之间的距离太远。数据库层应该完全不知道数据的来源,来源,性质或任何验证。
因此,无论您在入口点执行哪些验证,在数据库级别都必须使用预准备语句。