我正试图想出一种方法,用一个函数有效地轻松清理所有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);
}
对我而言,这似乎应该有效。但由于某种原因,它不会从表格中的一些复选框返回数组。他们一直空白。
我已经在没有上述功能的情况下测试了我的代码并且工作正常,我只想在那里增加一些安全性。
谢谢!
答案 0 :(得分:22)
尽可能使用filter_input(php5 +)它让它保持清洁,并且我知道你可以使用它来消毒和验证你可能需要的一切。
您可以使用filter var array和FILTER_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()
。