2012-07-14 65 views
5

是否有任何HTTP标头可禁用特定页面的Javascript? 我的网站提供用户生成的HTML内容(这就是为什么我不能只使用htmlenitities),我想要阻止脚本(JavaScript注入)。在特定页面上禁用Javascript执行(HTML/PHP)

我已经使用HttpOnly-cookies仅在主域上进行身份验证,而用户内容仅显示在无法读取cookie的子域上。 问题是执行JavaScript的可能性仍然太多 - 例如使用事件属性(如onclick),Internet Explorer甚至在CSS中有一个属性以允许执行JavaScript(expression),这是我以前从未听说过的。我读过的另一个有趣的想法是关于抛出一个异常以阻止后面的代码。 另一个想法是定义一个包含所有允许的标签的列表,另外还有一个包含每个允许的属性名称的数组,但这是非常困难的工作,我想这不会涵盖所有可能的注入。

我想我不是唯一有这个问题的人,所以有人知道可能性覆盖所有可能有害的代码 - 至少在现代浏览器?

一个类似于X-Scripting: disabled的简单虚构标题会让生活变得如此简单!

+0

你有没有想过在用户输入中阻止'script'标签和某些属性? – 2012-07-14 12:19:52

+0

这就是我的意思:“另一个想法是定义一个包含所有允许的标签的列表,另外还有一个包含每个允许的属性名称的数组,但这是非常困难的工作,我想这不会涵盖所有可能的注入。 (所以我会例如允许像“div”或“span”这样的无害标签并禁用诸如“onclick”,“onmouseover”之类的属性,但这不会涵盖所有注入,因为浏览器具有不同的,特定于浏览器的属性和属性) – 2012-07-14 12:22:32

回答

2

是的,有一个名为Content Security Policy的实验性HTTP标头,它允许您控制JavaScript来自哪里,这可能导致XSS无法使用。但目前仅支持Chrome和Firefox。

启用HttpOnly-cookies是一个好主意,但是这会严重阻止ZERO攻击。你仍然可以通过reading CSRF tokens, and carrying out requests with an XHR来利用XSS。

获取XSS的方法很多,像ShieldSeal这样的漏洞扫描程序会发现(几乎)所有这些方法。 Skipfish是一款非常原始的开源漏洞扫描程序,但它的免费。这是大多数Web应用程序处理广泛传播的漏洞的方式。 (我为SheildSeal工作,并帮助构建他们的漏洞扫描程序,我喜欢我的工作。)

当发现问题时,您应该使用htmlspecialchars($var)htmlspecialchars($var,ENT_QUOTES)来消毒输入。 ENT_QUOTES可以防止攻击者引入onclick或其他JavaScript事件。

+0

The唯一的问题是用户应该尽可能自由地生成他们的HTML内容,但不执行动态客户端代码。 SQL注入或PHP注入不是问题,因为代码存储在数据库中,而不是存储在.php文件中,并且在SQL语句中的任何用法之前清除所有参数。例如,像'src'这样的必要属性用于'img'-tags我不能简单地使用'ENT_QUOTES'并清理所有输入。但我会详细了解内容安全政策,以确保我的网站至少适用于Firefox/Chrome用户。 – 2012-07-14 15:10:05

+0

@Birk oah我误解了,那么你确实想使用HTMLPurifier。此外,您通常应该在使用时进行消毒,因此请对xss的输出进行消毒。但是,HTMLPurifier使用了大量资源,所以在插入数据库之前应该使用该资源。 – Mikey 2012-07-14 15:33:38

+0

@Birk,您可能还想查看Google Caja项目以安全嵌入HTML/CSS。 https://developers.google.com/caja/ – JackWink 2012-07-16 03:49:16