【问题标题】:How do I filter out Dangerous HTML like SO does? [duplicate]如何像 SO 那样过滤掉 Dangerous HTML? [复制]
【发布时间】:2012-04-08 20:12:07
【问题描述】:

我想在我的网站上提供一个 HTML 编辑器,但不想让自己受到 xss 或其他允许用户生成 HTML 的攻击。

这与 Stack Overflow 所做的非常相似。如何在此处检查/清理 HTML 以便保留样式信息,而将其他更危险的内容(如 javascript、iframe 等)排除在外?

是否有任何库(最好是 PHP)已经这样做了?

【问题讨论】:

  • 最好在 meta.stackoverflow.com 上询问
  • 最简单的方法是使用已知安全和允许的 HTML 标签列表,而不是试图过滤掉不好的东西。
  • @j08691, andreas:仅仅因为问题使用 SO 作为示例并不会自动使其成为元问题。
  • HTMLPurifier 可以解决问题; htmlpurifier.org
  • @Simeon Visser 是的,但这仍然留下了如何实际检查 html 的问题。 BoltClock 是的,谢谢。这与 SO 无关,我只是选择它作为我想要实现的最熟悉的示例。

标签: php html sanitization html-sanitizing


【解决方案1】:

PHP 有一个函数strip_tags,它可以从字符串中去除 HTML 和 PHP 标记,并允许您指定某些允许的标记。但正如@webarto 所说,有libraries 做得更好。

来自PHP Manual

【讨论】:

  • 这不是解决方案...htmlpurifier.org
  • @webarto 如何编写例如>< 但使它们在结果中可见?
  • @RokoC.Buljan htmlspecialcharshtmlentities...
  • @Roko C. Buljan:由于输入已经在 HTML 中,因此输入内容的用户(或页面上的 HTML 编辑器)必须注意转义诸如“
  • strip_tags 单独无法正确回答问题,因为它不会修改标签属性。如果只使用这种方法,仍然可以滥用标签属性。确保您最终使用的任何解决方案都对属性进行了清理,例如 onmouseover、href、onclick... 最好的清理是不清理,如果它适合您的需要,请考虑使用简单的替代方案,例如打开安全模式的 markdown。
【解决方案2】:

你可以使用

strip_tags($yourData,"<a><p><div><i>") // more tags you want to keep;

如果您也使用 SQL,请使用

mysql_real_escape_string($data);

这真的是你不需要被注射的全部。请记住,在使用 mySQL 真正的转义时,您需要使用 strip slashes 来将它们回显出来。

这是strip tags 的文档和mysql escape 的文档。

【讨论】:

    【解决方案3】:

    如果您希望允许某些 (X)HTML 并仅限制被视为不安全的标签,您可以使用 KSES 之类的东西。 Wordpress 使用了这样的解决方案。

    http://sourceforge.net/projects/kses/

    【讨论】:

      【解决方案4】:

      在Whymarrh 帖子的附录中,建议将代码工作放在您网站的子文件夹中,并自动更改任何具有“..”或“http://”或任何 mysql 命令的代码。

      【讨论】:

      • 这应该作为评论发布,而不是单独的答案。
      猜你喜欢
      • 2014-04-07
      • 1970-01-01
      • 2012-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-21
      • 2018-09-02
      • 1970-01-01
      相关资源
      最近更新 更多