清理$ _POST变量

时间:2009-10-22 23:26:34

标签: php security post variables

我正试图想出一种方法,用一个函数有效地轻松清理所有POST和GET变量。这是函数本身:

//clean the user's input
function cleanInput($value, $link = '')
{
    //if the variable is an array, recurse into it
    if(is_array($value))
    {
        //for each element in the array...
        foreach($value as $key => $val)
        {
            //...clean the content of each variable in the array
            $value[$key] = cleanInput($val);
        }

        //return clean array
        return $value;
    }
    else
    {
        return mysql_real_escape_string(strip_tags(trim($value)), $link);
    }
}

以下是可以称之为的代码:

//This stops SQL Injection in POST vars
foreach ($_POST as $key => $value)
{
    $_POST[$key] = cleanInput($value, $link);
}

//This stops SQL Injection in GET vars
foreach ($_GET as $key => $value)
{
    $_GET[$key] = cleanInput($value, $link);
}

对我而言,这似乎应该有效。但由于某种原因,它不会从表格中的一些复选框返回数组。他们一直空白。

我已经在没有上述功能的情况下测试了我的代码并且工作正常,我只想在那里增加一些安全性。

谢谢!

5 个答案:

答案 0 :(得分:22)

尽可能使用filter_input(php5 +)它让它保持清洁,并且我知道你可以使用它来消毒和验证你可能需要的一切。

您可以使用filter var arrayFILTER_SANITIZE_STRING标记来过滤整个帖子数组

filter_var_array($_POST, FILTER_SANITIZE_STRING) //just an example filter

w3schools filter reference

提供了大量不同的过滤器选项

答案 1 :(得分:7)

你所做的还不够。请参阅here

答案 2 :(得分:7)

为了使递归更加优雅,您可以使用array_map之类的东西,例如:

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

如果可以,请使用filter var,因为这些方法通常都很糟糕,但只是一个例子;)

答案 3 :(得分:2)

未选中的复选框不会发送到服务器。

您可以使用array_walk_recursive做您想做的事情

答案 4 :(得分:2)

这是清除输入的错误方法。

如果您在进行数据库查询后仍想使用数据,但是$_POST$_GET中的所有内容都将覆盖mysql转义为绝对会回来并咬你。不想在那里使用转义字符。

将参数化查询与mysqli或PDO一起使用,您将永远不需要使用mysql_real_escape_string()