【问题标题】:Sanitizing user input HTML with htmlspecialchars, nl2br, str_replace, htmlspecialchars_decode, and stripslashes使用 htmlspecialchars、nl2br、str_replace、htmlspecialchars_decode 和 stripslashes 清理用户输入 HTML
【发布时间】:2013-03-17 16:01:14
【问题描述】:

我做了这个功能

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 转换为 &lt;br&gt;
  • htmlspecialchars_decode 转换回原始字符​​li>
  • stripslashes 到 STRIPSLASHES

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

通常我问的是 (htmlspecialchars_decode) 因为它对我来说是新的。安全吗?总的来说,如果我用它来显示用户输入,我保证的功能是安全的吗?

(此场景中不涉及数据库。)

【问题讨论】:

  • 不要自己动手,用HTML Purifier
  • @MarkoD 我实际上读过它(很多)并且它有一个很好的代表。但这真的是要走的路吗?
  • 是的。另外,请阅读制作此网站的人制作自己的html sanitizer 的经验
  • 你是唯一一个愿意发表评论的人,所以我会接受你的建议。 Tnx @MarkoD !

标签: php html xss


【解决方案1】:

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

至少必须将&amp;lt; 转义为&amp;lt;

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

nl2br(htmlspecialchars($text_with_newlines, ENT_QUOTES));

在 HTML 中输出是安全的(除了 &lt;script&gt; 或需要 JavaScript 或 URL 的属性,例如 onclickhref(在后一种情况下有人可以使用 javascript:… URL))。

如果您想允许用户使用 HTML 标签,但不利用您的页面,那么执行此操作的正确函数将不适合 StackOverflow 帖子(数千行长,需要完整的 HTML 解析器,处理 URL 和 CSS,等等)——你必须使用重量级的东西,比如HTMLPurifier

【讨论】:

    猜你喜欢
    • 2012-11-11
    • 1970-01-01
    • 2018-02-16
    • 1970-01-01
    • 2014-04-18
    • 1970-01-01
    • 2013-11-17
    • 1970-01-01
    • 2013-09-14
    相关资源
    最近更新 更多