用户提交的HTML存在安全风险

时间:2011-09-24 17:39:37

标签: php html security contenteditable

我使用的是contentEditable div,允许用户编辑正文HTML,然后使用AJAX请求将其直接发布到网站。当然,我必须对它进行一些安全检查。最明显的是通过在提交的HTML中搜索<script来确保没有提交脚本标记。这是在首次运行htmlentities,将数据传输到另一台服务器,然后运行html_entity_decode后完成的。此外,必须关闭每个打开的标记,并且必须在用户提交的HTML中打开每个已关闭的标记。

忽略不相关的安全风险(例如SQL注入)和非安全风险(例如用户发布不适当的图像),还有哪些安全风险(如果有),特别是与允许用户将HTML直接添加到页面?

更具体地说,

  1. 是否有办法在不明确使用脚本标记的情况下将脚本放入页面中,或者
  2. 是否有办法通过编辑HTML而不使用脚本来破坏网站或其用户的安全性?

4 个答案:

答案 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,而是所有内容:onfocusonload,甚至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而不是尝试自行处理此问题。