使用htmlspecialchars,nl2br,str_replace,htmlspecialchars_decode和stripslashes清理用户输入HTML

时间:2013-03-17 16:01:14

标签: php html xss

我做了这个功能

function echoSanitizer($var)
{
$var = htmlspecialchars($var, ENT_QUOTES);
$var = nl2br($var, false);
$var = str_replace(array("\\r\\n", "\\r", "\\n"), "<br>", $var);
$var = htmlspecialchars_decode($var);
return stripslashes($var);
}

xss攻击会安全吗?

  • htmlspecialchars带走html标签
  • nl2br代表新行
  • str_replace将\ r \ n \ n转换为<br>
  • htmlspecialchars_decode转换回原始字符
  • stripslashes to STRIPSLASHES

为什么我需要所有这些?因为我想预览用户输入的内容,我想让他们看到所见即所得的东西。一些输入来自textarea框,我希望保留空格,因此需要nl2br。

一般来说,我问的是(htmlspecialchars_decode),因为它对我而言是新的。安全吗?总的来说,如果我使用它来显示用户输入,我会安全的功能吗?

(此方案中没有涉及数据库。)

1 个答案:

答案 0 :(得分:1)

在你的情况下htmlspecialchars_decode()使函数不安全。不允许用户插入未转义的<字符,因为这允许他们创建任意标记(和filtering/blacklisting is a cat and mouse game you can't win)。

至少<必须转义为&lt;

如果您只允许带有换行符的纯文本,则:

nl2br(htmlspecialchars($text_with_newlines, ENT_QUOTES));

可以安全地以HTML格式输出(<script>内部除外)或期望JavaScript或网址的属性,例如onclickhref(在后一种情况下有人可以使用javascript:… URL))。

如果你想允许用户使用HTML标签但不利用你的页面,那么正确的功能就不适合StackOverflow帖子(长达数千行,需要完整的HTML解析器,处理URL和CSS,等等) - 你必须使用像HTMLPurifier这样重量级的东西。