剥离标签,但特定的<span> -s

时间:2015-10-26 09:38:51

标签: php jquery handlebars.js

我有点卡在这里。我不知道哪种方法最好,最安全。我正在使用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时,我希望能够剥离(或编码?)除<span class="user-link">[...]</span>之外的所有HTML标记,因为我想要在评论列表中将其呈现为纯HTML。其他任何内容都应该是HTML编码并显示为文本。在任何恶意插入的情况下,我还想删除任何类型的事件(例如&#39; onclick&#39;在span标记上),并保留我的&#34; data-id&#34;和&#34;用户ID&#34;属性。

问题:我的方法应该在这里?我完全清楚HTML上的REGEX非常气馁。我应该制作<span class="user-link">[...]</span> BBCode吗?或者我应该坚持一些简单的正则表达式?我应该使用JS还是PHP?我该如何安全地渲染文本?

非常感谢您的时间!任何提示/链接都会非常有用。

1 个答案:

答案 0 :(得分:1)

我的建议是

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

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

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

主要话题是&#34;输入过滤和验证&#34;传入的用户输入。

你问过一个&#34;最佳实践&#34;或者&#34;如何解决这个问题&#34;。

它在这里描述:

  

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

     

但复杂的HTML速度极慢。考虑设置一个缓存解决方案来存储已清理的结果供以后使用。

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

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

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