本问题已经有最佳答案,请猛点这里访问。
我正在尝试提出一种方法,可以通过一个函数有效轻松地清除所有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);
}
对我来说,这似乎应该起作用。 但是由于某种原因,它不会从表单中的某些复选框返回数组。 他们总是空白。
我已经在没有上述功能的情况下测试了我的代码,并且工作正常,我只想在其中增加一点安全性。
谢谢!
您应该避免尝试针对每种情况清理所有内容。 这只会阻碍您的应用程序,并在您想要重新创建丢失的功能时使其难以保护。 这是禁用magic_quotes的正当理由。 php.net/manual/en/security.magicquotes.php在某种意义上,您正在重新创建一些东西。 您需要将输入发送到的应用程序清理输入。 如果要通过HTTP发送到浏览器,请对HTTP和HTML进行清理。 如果您将其发送到SQL DB,请对它进行SQL处理。
抱歉,我的意思是不赞成使用:php.net/manual/en/security.magicquotes.php
感谢所有的帮助/建议! 看来我需要重新考虑自己的过程。 :-)
如果可能的话,使用filter_input(php5 +),这样可以使它更整洁,并且就我所知,您可以清理和验证使用它可能需要的一切。
您可以使用filter var array和例如FILTER_SANITIZE_STRING标志来过滤整个帖子数组
filter_var_array($_POST, FILTER_SANITIZE_STRING) //just an example filter
w3schools过滤器参考中提供了许多不同的过滤器选项
哦,太棒了! 香港专业教育学院从未见过此:)
这是最好的方法,如果您有php5
为了使递归更加优雅,您可以使用例如array_map之类的东西:
$_POST = array_map('mysql_real_escape_string',$_POST);
如果可以的话,请使用filter var,因为这些方法通常都是不好的,不过只是一个例子;)
您所做的还不够。看这里。
这是清理输入的错误方法。
如果对数据库进行查询后仍然想使用数据,但又不想在其中转义字符,那么对$_POST和$_GET中的所有内容都使用转义的mysql绝对会回来咬你。那里。
在mysqli或PDO中使用参数化查询,您将永远不需要使用mysql_real_escape_string()。
更糟糕的是,如果您没有已启动的数据库连接。
我已经在函数调用的上方设置了连接,但是你们不需要看到Ive到那里了。 ;-)
请参阅:php.net/manual/en/security.magicquotes.php
未选中的复选框不会发送到服务器。
您可以使用array_walk_recursive做您想要的