我有一个简单的联系表格,包括姓名,电子邮件,选择列表和textarea。在我的邮件程序php脚本中,我正在尝试添加一个简单的过滤器来防止SQL注入或其他形式的黑客攻击。
例如,我正在使用
$name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_SPECIAL_CHARS);
这是好事吗?
答案 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>
,则该值将转换为<a href='test'>Test</a>
答案 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了解更多信息。