我使用的是contentEditable div,允许用户编辑正文HTML,然后使用AJAX请求将其直接发布到网站。当然,我必须对它进行一些安全检查。最明显的是通过在提交的HTML中搜索<script
来确保没有提交脚本标记。这是在首次运行htmlentities
,将数据传输到另一台服务器,然后运行html_entity_decode
后完成的。此外,必须关闭每个打开的标记,并且必须在用户提交的HTML中打开每个已关闭的标记。
忽略不相关的安全风险(例如SQL注入)和非安全风险(例如用户发布不适当的图像),还有哪些安全风险(如果有),特别是与允许用户将HTML直接添加到页面?
更具体地说,
答案 0 :(得分:2)
是的,是的。
用户可以使用很多方法注入没有脚本标记的脚本。
他们可以在JS处理程序中执行此操作
<div onmouseover="myBadScript()" />
他们可以在hrefs
中完成<a href="javascript:myBadScript()">Click me fool!!</a>
他们可以从外部来源
<iframe src="http://www.myevilsite.com/mybadscripts.html" />
他们可以在各种方式中做到这一点。
我担心允许用户这样做的想法并不是一个好主意。看看使用Wiki markup / down。它会更安全。
答案 1 :(得分:2)
是。恶意代码可以通过多种方式注入您的网站。
其他答案已经提到了所有最明显的答案,但有很多更微妙的方法可以进入,如果您要接受用户提交的HTML代码,您需要了解它们所有,因为黑客不只是尝试明显的东西然后放弃。
您需要检查所有事件处理属性 - 不只是onclick
,而是所有内容:onfocus
,onload
,甚至onerror
和{ {1}}可以被黑客入侵。
但更重要的是,你需要注意那些旨在通过验证的黑客攻击。例如,使用损坏的HTML来混淆解析器,使其认为是安全的:
onscroll
或
<!--<img src="--><img src=fakeimageurl onerror=MaliciousCode();//">
或
<style><img src="</style><img src=fakeimageurl onerror=DoSomethingNasty();//">
所有这些都很容易通过验证器。
并且不要忘记真正的黑客攻击可能比这更加模糊。他们会努力使你难以发现,或者了解你正在做什么,你会发现它。
我将通过推荐这个网站完成:http://html5sec.org/其中包含大量攻击媒介的详细信息,其中大部分都是我当然不会想到的。 (上面的例子都列在清单中)
答案 2 :(得分:1)
您是否考虑过<object>
和<embed>
个对象的安全风险?
我使用strip_tags()
来删除html标记
答案 3 :(得分:1)
通过在元素上使用事件属性,可以通过任意数量的方式调用Javascript,例如:
<body onload="..">
发布的类似问题here建议您使用HTMLPurifier而不是尝试自行处理此问题。