【发布时间】: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 标签,除了 <span class="user-link">[...]</span> 一个,因为我想要在评论列表中将其呈现为纯 HTML。其他任何内容都应进行 HTML 编码并显示为文本。在任何恶意插入的情况下,我还想删除任何类型的事件(如 span 标签上的“onclick”),只保留我的“data-id”和“user-id”属性。
问题:我的方法应该是什么?我完全知道 HTML 上的正则表达式非常不受欢迎。我应该制作<span class="user-link">[...]</span> 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