我正在使用HTML函数将html内容插入到db表中,并过滤用于过滤用户输入以防止SQL注入攻击。得到这样的输出prntscr.com/3c8ht。我有以下问题:
1)在插入和输出之前,需要从哪些函数传递HTML内容? 2)还需要什么过滤功能或是否有任何未使用的功能?
提前谢谢
function filter($data, $db)
{
$data = $db->escape_string($data);
$data = htmlspecialchars($data, ENT_IGNORE, 'utf-8');
$data = strip_tags($data);
$data = stripslashes($data);
$data = htmlentities($data);
return $data;
}
function html($data, $db)
{
$data = $db->escape_string($data);
return $data;
}
答案 0 :(得分:2)
您应该使用媒体所需的转义工具,而不仅仅是任何地方的人。
为了避免SQL注入,mysql_real_escape_string()是最小的,你需要使用的。 更好的选择是使用预准备语句和参数化查询(查看PDO扩展,自v 5.1 IIRC以来随PHP一起提供),这将是避免此类漏洞利用的最安全的选择。
将未转义的html发送到数据库不会做任何事情,因为恶意脚本当然不会被执行。 HMTL需要在OUTPUT上进行消毒,无论何时打算在页面上打印出来,都应该在需要时进行,而不是先验。
要保护html,您可以使用htmlentities()作为最小步骤。您可能还需要考虑使用复杂的过滤器来替换“坏”字和坏字符的出现:这是一个更复杂的情况,需要很长时间的操作,但当然会为您提供最准确的安全级别。您可以针对此主题提出另一个问题,或在此搜索SO Strip_tags()可能会破坏你的标记(它不再是html,更可能是纯文本),除了根本不是安全的。
答案 1 :(得分:1)
每次使用用户输入存储在数据库中时,都应使用mysql_real_escape_string()
。
现在,如果您检索包含换行符的长文本,请在打印数据时使用nl2br()
。
http://php.net/manual/en/function.mysql-real-escape-string.php