我正在使用一个 contentEditable div,它允许用户编辑正文 HTML,然后使用 AJAX 请求将其直接发布到站点。当然,我必须对其进行一些安全检查。最明显的是确保没有通过搜索 <script
提交任何脚本标签。在提交的 HTML 中。这是在第一次运行 htmlentities
之后完成的,将数据传输到另一台服务器,然后运行 html_entity_decode
.此外,每个打开的标签都必须关闭,并且每个关闭的标签都必须在用户提交的 HTML 中打开。
忽略不相关的安全风险(例如 SQL 注入(inject))和非安全风险(例如用户发布不当图片),还有哪些其他安全风险(如果有)特别与允许用户将 HTML 直接添加到页面?
更具体地说,
- 有没有办法在不明确使用脚本标签的情况下将脚本放入页面,或者
- 是否可以通过在不使用脚本的情况下编辑 HTML 来危及网站或其用户的安全?
最佳答案
是的。恶意代码可以通过多种方式注入(inject)您的网站。
其他答案已经提到了所有最明显的方法,但是还有很多更微妙的方法可以进入,如果您要接受用户提交的 HTML 代码,则需要了解它们全部,因为黑客不会只尝试明显的东西然后放弃。
您需要检查所有 事件处理属性 - 不仅仅是 onclick
,而是所有内容:onfocus
、onload
, 甚至 onerror
和 onscroll
也可以被破解。
但比这更重要的是,您需要提防旨在通过您的验证的黑客攻击。例如,使用损坏的 HTML 让您的解析器误以为它是安全的:
<!--<img src="--><img src=fakeimageurl onerror=MaliciousCode();//">
或
<style><img src="</style><img src=fakeimageurl onerror=DoSomethingNasty();//">
或
<b <script>ReallySneakyJavascript();</script>0
所有这些都可以轻松通过验证器。
并且不要忘记,真正的黑客攻击可能比这更令人困惑。他们会努力让您难以发现,或者在您确实发现它的情况下理解它在做什么。
最后我会推荐这个网站:http://html5sec.org/其中包含大量攻击向量的详细信息,其中大部分我当然不会想到。 (上面的例子都在列表中)
关于php - 用户提交的 HTML 带来的安全风险,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7540700/