2011-09-24 72 views
2

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

忽视不相关的安全风险(如SQL注入)和非安全风险(如用户发布不适当的图像),还有什么其他安全风险,如果有的话,具体链接到允许用户添加HTML直接到一个页面?

更具体地讲,

  1. 是把脚本的页面有办法没有明确使用脚本标签或
  2. 有没有方法可以危及站点的安全性和它的用户可以通过编辑没有使用脚本的HTML?
+0

可能出现的[在PHP网站中避免xss攻击的最佳做法]的重复(http://stackoverflow.com/questions/71328/what-are-the- best-practices-for-avoid-xss-attack-in-a-php-site) – Quentin

+0

这当然是这个问题的一个子集,但这个问题稍微宽泛一些。我相信对这个问题的理想答案已经在这里提出,而对这个问题的答案并不适合这个问题。 –

回答

1

的Javascript可以通过使用元素的事件属性,如被称为任意数量的方式:

<body onload=".."> 

类似的问题贴here建议使用HTMLPurifier而不是试图自己处理这个问题。

+0

从@JasonDean和这个帖子都非常有用,并很好地回答了这个问题。我一定会使用HTMLPurifier。 –

1

您是否认为<object><embed>对象存在安全风险?

我会使用strip_tags()剥html标签

2

是的,是的。

用户注入脚本时没有脚本标记的方法很多。

他们能做到这一点的JS处理

<div onmouseover="myBadScript()" /> 

他们可以在HREF中

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

他们可以从外部源做

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

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

恐怕让用户做到这一点的想法并不好。看看使用Wiki标记/下来。它会更安全。

2

是的。有多种方式可以将恶意代码注入到您的网站中。

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

你需要检查所有事件处理属性 - 不仅仅是onclick,但一切:onfocusonload,甚至onerroronscroll可以被黑客攻击。

但是更重要的是,您需要注意那些旨在通过验证的黑客。例如,使用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/其中有大量的攻击媒介的细节,其中大部分我当然不会想到。 (上面的例子都是列表中的功能)