过滤表格输入

时间:2010-09-25 15:56:40

标签: php sql forms input filter

我有一个简单的联系表格,包括姓名,电子邮件,选择列表和textarea。在我的邮件程序php脚本中,我正在尝试添加一个简单的过滤器来防止SQL注入或其他形式的黑客攻击。

例如,我正在使用

$name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_SPECIAL_CHARS);
这是好事吗?

4 个答案:

答案 0 :(得分:1)

首先让我告诉你,大约85%的保护方法是用2个功能完成的。

首先,如果有人向您的网站发送了一些数据,例如$_POST['name'],并且您希望在html端使用此值,例如<p>The following string: {$_POST['name']} is invalid</p>,那么您应始终确保该值已通过htmlspecialchars,这将保护大多数的XSS尝试

接下来是注入,如果$_POST['name']的值进入您的数据库,请确保在该值上使用mysql_real_escape_string

这将为您提供100%的sql注入保护,但这意味着您的数据库无法运行来自用户的命令,这并不意味着该文本应该是它。

在将数据插入数据库之前应始终使用的函数是

这称为验证,仅用于确保用户提交的数据是您想要的数据,例如 filter_var 将用于验证他们输入的电子邮件是一封电子邮件而不仅仅是一些 blah blah

我通常在帐篷里做的是运行一个干净的功能,以确保使用htmlspecialchars清除所有插补数据

示例:

function clean($array)
{
    foreach($array as $key => $val)
    {
        if(is_array($val))
        {
            $array[$key] = clean($val); //Recursive 
        }else
        {
            $array[$key] = htmlspecialchars($val, ENT_QUOTES);
        }
    }
    return $array;
}

然后执行以下操作以确保您从XSS安全:

$_GET = clean($_GET);
$_POST = clean($_POST);

因此,如果有人尝试提交<a href='test'>Test</a>,则该值将转换为&lt;a href=&#039;test&#039;&gt;Test&lt;/a&gt

答案 1 :(得分:0)

要测试效果,请尝试使用SQL注入攻击攻击您自己的网站。基本上,尝试传递' || 1=1之类的字符串,看看是否收到错误。如果您收到错误消息,或者您收到意外结果,您的网站就会受到攻击。否则,它可能正在运作;但可以肯定的是,请确保进行大量测试。

答案 2 :(得分:0)

更好的选择是使用mysqli扩展和预处理语句。但是,确实存在mysql_real_escape_string()函数,该函数专门“转义字符串中的特殊字符以用于SQL语句”。

答案 3 :(得分:0)

FILTER_SANITIZE_SPECIAL_CHARS执行HTML-escape&#39;&#34;&lt;&gt;&amp;和ASCII值小于32的字符。要获得htmlspecialchars()的完整等效项,请使用FILTER_SANITIZE_FULL_SPECIAL_CHARS,这相当于设置ENT_QUOTES调用htmlspecialchars()。使用此函数应该使用mysql_real_escape_string()过时,但安全第一:)

另见:http://php.net/manual/en/filter.filters.sanitize.php了解更多信息。