什么是在PHP中清理整个$ _POST数组的好方法?

时间:2010-09-05 05:38:08

标签: php arrays sanitization

我有一个包含大量变量的表单,然后发送电子邮件,而不是使用$_POST清理每个filter_var($_POST['var'], FILTER_SANITIZE_STRING);值。我使用的是一段更简单的代码。我提出了下面的内容,这似乎有效,因为我认为默认操作是FILTER_SANITIZE_STRING,但我只是想知道人们的意见是什么,如果这不是好的做法,也许你可以告诉我为什么?然后将$_POST值单独嵌入到新变量中,因此我只会在开始时使用array_map来清理所有内容...

$_POST = array_map('filter_var', $_POST);

感谢您的回复,基本上为您提供更多信息:

我在表单中有20到30个输入字段被捕获, 然后将数据显示给用户以检查他们的输入, 变量然后被消毒, 然后向用户发送电子邮件 然后最后将详细信息输入到数据库中。

目前我正在使用上面的array_map函数清理,以及在发送电子邮件之前使用电子邮件地址上的FILTER_SANITIZE_EMAIL,然后在插入数据库之前使用mysql_real_escape_string()转义输入。没有准备好的陈述等等。你认为我应该做什么吗?再次感谢!

5 个答案:

答案 0 :(得分:70)

如果您的每个输入变量的类型都是一个字符串,并且您希望一次完全清理它们,则可以使用:

// prevent XSS
$_GET   = filter_input_array(INPUT_GET, FILTER_SANITIZE_STRING);
$_POST  = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);

这将清理$ _GET和$ _POST数组。

见到这里:PHP -Sanitize values of a array

答案 1 :(得分:19)

取决于它的用途。

如果你将它插入到数据库中,那么引用字符串的mysql_real_escape_string()和数字的类型转换将是要走的路 - 这是理想的准备语句,但这是完全不同的事情。

如果您计划将数据输出到网页上,那么我会推荐htmlspecialchars()

之类的内容

如果您打算将用户输入用作shell参数,那么您将使用escapeshellarg()

转到关于发送电子邮件的问题。那么,以下就足够了:

filter_var($_POST['message'], FILTER_SANITIZE_STRING);

所有这些基本上都是条带标签并对特殊字符进行编码。

答案 2 :(得分:5)

没有正确的方法来进行全面的卫生设施。您需要什么样的卫生方法取决于对数据的处理方式。

在使用数据之前直接清理数据。

答案 3 :(得分:1)

这是我在所有项目中使用的内容:

function util_array_trim(array &$array, $filter = false)
{
    array_walk_recursive($array, function (&$value) use ($filter) {
        $value = trim($value);
        if ($filter) {
            $value = filter_var($value, FILTER_SANITIZE_STRING);
        }
    });

    return $array;
}

它允许修剪和清理已发布数据的嵌套数组

答案 4 :(得分:0)

要在多个字段上应用特定的过滤器,请使用switch语句。

$post  = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);

foreach($post as $k => $v) {
    switch ($k) {
        case 'int_1':
        case 'int_2':
            $post[$k] = filter_var($v, FILTER_SANITIZE_NUMBER_INT) * 1;
            break;
        case 'float_1':
        case 'float_2':
            $post[$k] = filter_var($v, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION) * 1;
            break;
        default:
            break;
    }
}

注意:我的IDE(NetBeans)警告不要在任何地方使用全局$_POST作为安全冲突,因此我已经习惯于使用局部$post变量。如果您选择不先进行橡皮布卫生,则FILTER_SANITIZE_STRING可以用于default:情况。