繁体   English   中英

过滤表单输入

[英]filtering form inputs

我有一个简单的联系表单,其中包含姓名,电子邮件,选择列表和文本区域。 在我的邮件php脚本中,我试图添加一个简单的过滤器以防止SQL注入或其他形式的黑客入侵。

例如,我正在使用

$name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_SPECIAL_CHARS);

这个好吗?

首先让我告诉您,约有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将用于验证他们输入的电子邮件是电子邮件,而不仅仅是一些等等

我通常做的事情是运行一个clean函数,以确保使用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

FILTER_SANITIZE_SPECIAL_CHARS HTML转义'“ <>&和ASCII值小于32的字符。要完全等同于htmlspecialchars() ,请使用FILTER_SANITIZE_FULL_SPECIAL_CHARS ,这等效于调用已设置ENT_QUOTES的htmlspecialchars()。 mysql_real_escape_string()的版本已过时,但安全至上:)

另请参见: http : //php.net/manual/en/filter.filters.sanitize.php以获取更多信息。

为了测试有效性,请尝试使用SQL注入攻击来攻击您自己的站点。 基本上,尝试传递诸如' || 1=1' || 1=1字符串 ' || 1=1 ,看看是否出现错误。 如果您收到错误消息,或者获得意外结果,则您的网站容易受到攻击。 否则,它可能会起作用。 但可以肯定的是,请确保您进行了大量测试。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM