来自用户提交的HTML的安全风险


Security risks from user-submitted HTML

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

忽略不相关的安全风险(如SQL注入)和非安全风险(如用户发布不适当的图像),如果有的话,与允许用户直接向页面添加HTML相关的其他安全风险是什么?

更具体地说,

  1. 是否有办法在页面中放置脚本而不显式地使用脚本标签,或
  2. 有没有办法通过编辑HTML而不使用脚本来损害网站或其用户的安全?

是。恶意代码可以通过多种方式注入到您的站点。

其他答案已经提到了所有最明显的方法,但是还有很多更微妙的方法可以进入,如果你要接受用户提交的HTML代码,你需要了解所有的方法,因为黑客不会只是尝试明显的东西然后放弃。

您需要检查所有事件处理属性-不仅仅是onclick,而是所有:onfocus, onload,甚至onerroronscroll都可以被黑客攻击。

但更重要的是,您需要注意那些旨在通过验证的hack。例如,使用破损的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/,其中有大量攻击向量的详细信息,其中大多数我肯定不会想到。

是,是。

有很多方法可以让用户注入没有脚本标签的脚本。

可以在JS处理程序中完成

<div onmouseover="myBadScript()" />

他们可以在href

<a href="javascript:myBadScript()">Click me fool!!</a>

他们可以从外部资源

<iframe src="http://www.myevilsite.com/mybadscripts.html" />

他们可以用各种方式做到这一点。

恐怕允许用户这样做不是一个好主意。考虑使用Wiki标记/down代替。这样会安全得多。

Javascript可以通过使用元素上的事件属性以多种方式调用,例如:

<body onload="..">

一个类似的问题张贴在这里建议使用HTMLPurifier,而不是试图自己处理这个

您是否考虑过<object><embed>对象的安全风险?

我会使用strip_tags()剥离html标签