什么是XSS的共同防御?

换句话说,现在使用最多的技术来清理input和/或输出? 工业(甚至是个人用途)网站的人们用什么来解决这个问题呢?

您应该参考优秀的OWASP网站 ,了解攻击( 包括XSS )和攻击的总结。 下面是我可以提出的最简单的解释,其实际上可能比他们的网页更可读(但可能几乎没有完成)。

  1. 指定一个字符集。 首先,确保您的网页在头文件或head元素的开头指定了UTF-8字符集,对所有的input进行HTML编码,以防止Internet Explorer(和旧版本的Firefox)出现UTF-7攻击努力预防XSS。

  2. HTML转义。 请记住,您需要HTML转义所有用户input。 这包括用<> with &gt;&&amp;" with &quot;如果你曾经使用过单引号的HTML属性,那么你也需要用' &#39; '代替。典型的服务器端脚本语言, 比如PHP提供了这样的function,我鼓励你通过创build标准函数来扩展插入HTML元素,而不是以特别的方式插入它们。

  3. 其他types的逃跑。 但是,您仍然需要小心,不要将用户input插入为未加引号的属性或解释为JavaScript的属性(例如onloadonmouseover )。 显然,这也适用于script元素,除非input正确的JavaScript转义,这是不同于HTML转义。 另一种特殊types的转义是对URL参数进行URL转义(在HTML转义之前将其正确地包含在链接中)。

  4. validationurl和CSS值。 链接和图像的URL(无需基于批准的前缀进行validation)也是如此,因为javascript: URLscheme以及style属性中的CSS样式表URL和数据。 (Internet Explorer允许将JavaScriptexpression式作为CSS值插入,而Firefox对XBL的支持也是类似的问题。)如果您必须包含来自不受信任源的CSS值,则应该严格validationCSS或将其转义。

  5. 不允许用户提供的HTML。 如果您有select,请勿允许用户提供的HTML。 这是一个简单的方法来结束一个XSS的问题,所以正在写一个“parsing器”为您自己的标记语言基于简单的正则expression式replace。 只允许格式化的文本,如果HTML输出是由一个真正的parsing器以明显安全的方式生成的,使用标准转义函数从input中转义任何文本,并单独构buildHTML元素。 如果您无权select,请使用AntiSamy等validation程序 。

  6. 防止基于DOM的XSS。 不要在JavaScript生成的HTML代码中包含用户input并将其插入到文档中。 相反,使用适当的DOM方法来确保它被处理为文本,而不是HTML。

显然,我不能涵盖攻击者可以插入JavaScript代码的每一个案例。 一般来说, 使用HTTP的 cookie可能会使XSS攻击变得困难(但决不是阻止),并且给程序员安全培训是至关重要的。

有两种XSS攻击。 一个是你的网站允许以某种方式注入HTML的地方。 这不是很难防范:要么逃避所有的用户input数据,要么剥离所有的<>标签,而是支持类似UBB代码的东西。 注意:url可能仍然会打开你的Rick滚动式攻击。

更深层次的是一些第三方网站包含一个IFRAME,SCRIPT或IMG标签或类似的东西,在你的网站上点击一个URL,这个URL将使用用户目前对你的网站的任何authentication。 因此,您绝对不应该直接采取任何行动来回应GET请求。 如果你得到一个GET请求,试图做任何事情(更新一个configuration文件,检查一个购物车等),那么你应该回应一个表单,反过来需要一个POST被接受。 这个表单还应该包含一个跨站请求伪造令牌,这样任何人都不能在第三方站点上build立一个表单来提交给你的网站使用隐藏字段(以避免伪装攻击)。

代码中只有两个主要区域需要正确解决,以避免xss问题。

  1. 在查询中使用任何用户input值之前,使用数据库辅助函数(如mysql_escape_string)覆盖数据,然后在查询中使用它。 这将保证xss安全。

  2. 在将用户input值显示回表单input字段之前,将它们传递给htmlspecialchars或htmlentities。 这将把所有的xss容易的值转换成浏览器可以显示的字符,而不会被泄露。

一旦你完成了上述的工作,你就可以从xss攻击中获得95%以上的安全性。 然后,您可以继续学习安全网站的高级技术,并在您的网站上应用额外的安全性。

大多数框架所做的是阻止你直接编写HTML表单代码或以stringforms进行查询,因此,使用框架帮助器函数,代码保持清洁,任何严重的问题都可以通过更新一行或两行代码在框架中。 你可以简单地写一个你自己的小图书馆,并在所有的项目中重复使用它们。

如果您使用.NET进行开发,避免XSS的最有效方法之一就是使用Microsoft AntiXSS Library 。 这是一个非常有效的方式来消毒你的input。

在JSTL / JSP中,防止XSS的最好方法是使用c:out标签,而不将默认的escapeXml参数设置为false。

 <c:out value="${somePossiblyDangerousVar}"/>