【问题标题】:Strip tags except specific <span>-s去除除特定 <span>-s 之外的标签
【发布时间】:2015-10-26 09:38:51
【问题描述】:

我有点卡在这里。我不知道哪种方法最好且最安全。我正在使用 REST API 和 Handlebars.js。

上下文:我有用户生成的内容,可能如下所示:

<span class="user-link" data-id="12345" user-id="67890">
    Name    
</span>
Blablabla my comment 
<script>
    alert("malicious");
</script> 
blabla 
<b>bold</b>
<span onclick='window.location("http://maliciouswebsite");'>
    bla
</span>

目标:当对 API 进行 POST 时,我希望能够剥离(或编码?)所有 HTML 标签,除了 &lt;span class="user-link"&gt;[...]&lt;/span&gt; 一个,因为我想要在评论列表中将其呈现为纯 HTML。其他任何内容都应进行 HTML 编码并显示为文本。在任何恶意插入的情况下,我还想删除任何类型的事件(如 span 标签上的“onclick”),只保留我的“data-id”和“user-id”属性。

问题:我的方法应该是什么?我完全知道 HTML 上的正则表达式非常不受欢迎。我应该制作&lt;span class="user-link"&gt;[...]&lt;/span&gt; BBCode 吗?或者我应该坚持一些简单的正则表达式?我应该使用 JS 还是 PHP?我应该如何安全地渲染文本?

非常感谢您抽出宝贵时间!任何提示/链接都会有很大帮助。

【问题讨论】:

  • 与其讨论这个问题,为什么不改变你的编辑器来禁止HTML呢?您可以使用 markdown 使用一组受限的 UI 选项(类似于 SO 的工作方式)来格式化网站,然后在服务器端将其转换为有效的 HTML。
  • 您好,感谢您的意见。我对你的建议考虑了很久,我想我可以解决这个问题,但我仍然面临一个问题;我需要“data-id”和“user-id”属性。实际上,我正在使用类似于 SO 的系统,我在其中键入“@”字符,它会给出名称建议,我选择一个,然后将其附加到我的 contentEditable DIV。据我所知,将“@”的值(用户名)与其用户 ID 相关联是我只能从 contentEditable DIV 中的结果 HTML()中获取的内容。我真的不知道 SO/FB 是怎么做到的……

标签: php jquery handlebars.js


【解决方案1】:

我的建议是

  • 您可以在客户端限制允许的输入

  • 在服务器端应用输入验证

  • 在服务器端应用输入验证和过滤
    • 见下面的striptags,按白名单、黑名单过滤
  • 永远不要忘记只有 Chuck Norris 可以使用正则表达式解析 HTML。

主要主题是传入用户输入的“输入过滤和验证”。

您已询问“最佳实践”或“如何解决此问题”。

这里有描述:

对于许多网络应用来说,仅仅转义 HTML 是不够的。你可能 想要完全删除任何 HTML,或允许一小部分 HTML 通过。为此,请使用 HTML Purifier 库。

但是对于复杂的 HTML 来说它非常慢。考虑设置一个缓存解决方案来存储清理后的结果以供以后使用。

点击最后​​一个链接时,您会找到一个使用 HTML Purifier 的代码示例。净化器使用 HTML 标签白名单/黑名单方法。它很慢,因为过滤是一项复杂的任务。

还有其他工具:http://htmlpurifier.org/comparison

当您将允许的输入限制为降价时,您可以使用降价解析器来准备输出。这仍然会解析整个输入,但比应用白名单/黑名单净化更快。

【讨论】:

    猜你喜欢
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 2017-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多