我有点卡在这里。我不知道哪种方法最好,最安全。我正在使用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?我该如何安全地渲染文本?
非常感谢您的时间!任何提示/链接都会非常有用。
答案 0 :(得分:1)
我的建议是
您可以限制客户端允许的输入
Handlebars.SafeString()
- 参考。 https://stackoverflow.com/a/21471546/1163786 在服务器端应用输入验证
主要话题是&#34;输入过滤和验证&#34;传入的用户输入。
你问过一个&#34;最佳实践&#34;或者&#34;如何解决这个问题&#34;。
它在这里描述:
对于许多网络应用来说,仅仅转发HTML并不够。你可能 想要完全删除任何HTML,或允许一小部分HTML 通过。为此,请使用 HTML Purifier 库。
但复杂的HTML速度极慢。考虑设置一个缓存解决方案来存储已清理的结果供以后使用。
您可以在关注最后一个链接时找到使用HTML Purifier的代码示例。净化器使用HTML标记白名单/黑名单方法。它很慢,因为过滤是一项复杂的任务。
还有其他工具:http://htmlpurifier.org/comparison
当您将允许的输入限制为markdown时,您可以使用markdown解析器来准备输出。这仍将解析整个输入,但比应用白名单/黑名单纯化更快。