本文介绍常见的Web客户端安全漏洞。

跨站脚本攻击(XSS)

跨站脚本攻击(Cross Site Script,简称XSS)通常指黑客通过HTML注入方式篡改了网页并插入恶意脚本,从而在用户浏览网页时,控制用户浏览器的一种攻击行为。XSS漏洞可被用于用户身份窃取(特别是管理员)、行为劫持、挂马、蠕虫、钓鱼等。跨站脚本攻击是目前Web客户端安全中最严重的漏洞。

跨站脚本攻击根据效果的不同可以分为以下三种。
  • 反射型XSS攻击:页面仅把用户输入直接回显在页面或源码中,诱导用户点击访问包含恶意代码的URL。
  • 存储型XSS攻击:XSS攻击代码存储在服务器中。由于用户可能会主动浏览被攻击页面,此种方法危害较大。
  • DOM型XSS攻击:通过修改页面的DOM节点形成XSS。

常见发生位置:所有涉及到用户可控的输入输出点,如个人信息、文章、留言等。

防御措施:
  • 对重要的Cookie字段使用HTTPOnly参数。
  • 检查所有用户可控输入。对所有的输入点进行严格的检查,过滤或拦截所有不符合当前语境的输入。由于一般无法预期所有可能的输出点语境,此种方法效果较差。
  • 检查所有用户输入的输出点。由于XSS攻击最终是发生在输出点,因此需要分析出用户输入数据的所有输出点的环境,是输入在HTML标签中,还是HTML属性、Script标签、事件、CSS 位置中。针对不同的输出位置,制定不同的转义或过滤规则。
  • 处理富文本。在文章、论坛等需要用到富文本的地方,需要特别注意富文本与XSS的区分,严格禁止所有的危险标签及事件,原则上应当使用白名单过滤标签、事件及属性。

跨站点请求伪造(CSRF)

跨站点请求伪造(Cross Site Request Forgery,简称CSRF)。由于重要操作的所有参数都是可以被攻击者猜到,攻击者即可伪造请求,利用用户身份完成攻击操作,如发布文章、购买商品、转账、修改资料甚至密码等。

常见发生位置:所有由用户(包括管理员)发起的操作点。

防御措施:
  • 辅助验证方法:使用验证码。验证码是对抗CSRF攻击最简单有效的方法,但会影响用户的使用体验,并且不是所有的操作都可以添加验证码防护。因此,验证码只能作为辅助验证方法。
  • 通用防护方法:添加足够随机的csrf_token并每次更新,以防止参数被猜解。使用CSRF_token是目前通用的防护方法。
  • 其他防御措施:验证HTTP Referer,拒绝不安全的来源。但服务器并非在任何情况下都能获取到Referer值。
说明 建议结合上述三种方法进行防御。