使用filter_input和FILTER_SANITIZE_NUMBER_INT清理GET

时间:2014-05-14 01:54:30

标签: php validation

我有一个名为ID的主键表。 ID将传递给页面,如:

testpage.php?ID=123.

如果我使用:

$sanitized_id = filter_input(INPUT_GET, 'ID', FILTER_SANITIZE_NUMBER_INT) 

可以在查询中安全地使用$ sanitized_id吗?

4 个答案:

答案 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。

无论输入验证与“在查询中使用数据”无关。

在设计合理的应用程序中,这些层(输入验证和数据库交互)应该是分开的,并且相互之间的距离太远。数据库层应该完全不知道数据的来源,来源,性质或任何验证。

因此,无论您在入口点执行哪些验证,在数据库级别都必须使用预准备语句。