前端安全系列(一):如何防止XSS攻击?

xss = getParameter("redirect_to").startsWith('javascript:');allowSchemes = ["http", "https"];>>

用户点击这个 URL 时,服务端取出请求 URL,拼接到 HTML 响应中:


  • 浏览器接收到响应后就会加载执行恶意脚本 //xxxx.cn/image/t.js ,在恶意脚本中利用用户的登录状态进行关注、发微博、发私信等操作,发出的微博和私信可再带上攻击 URL,诱导更多人点击,不断放大攻击范围。这种窃用受害者身份发布恶意内容,层层放大攻击范围的方式,被称为“XSS 蠕虫”。

    扩展阅读:Automatic Context-Aware Escaping

    上文我们说到:

    1. 合适的 HTML 转义可以有效避免 XSS 漏洞。
    2. 完善的转义库需要针对上下文制定多种规则,例如 HTML 属性、HTML 文字内容、HTML 注释、跳转链接、内联 JavaScript 字符串、内联 CSS 样式表等等。
    3. 业务 RD 需要根据每个插入点所处的上下文,选取不同的转义规则。

    通常,转义库是不能判断插入点上下文的(Not Context-Aware),实施转义规则的责任就落到了业务 RD 身上,需要每个业务 RD 都充分理解 XSS 的各种情况,并且需要保证每一个插入点使用了正确的转义规则。

    这种机制工作量大,全靠人工保证,很容易造成 XSS 漏洞,安全人员也很难发现隐患。

    2009年,Google 提出了一个概念叫做: Automatic Context-Aware Escaping

    所谓 Context-Aware,就是说模板引擎在解析模板字符串的时候,就解析模板语法,分析出每个插入点所处的上下文,据此自动选用不同的转义规则。这样就减轻了业务 RD 的工作负担,也减少了人为带来的疏漏。

    在一个支持 Automatic Context-Aware Escaping 的模板引擎里,业务 RD 可以这样定义模板,而无需手动实施转义规则:




    {{.title}}





    模板引擎经过解析后,得知三个插入点所处的上下文,自动选用相应的转义规则:

     



    {{.title | htmlescaper}}





    目前已经支持 Automatic Context-Aware Escaping 的模板引擎有:

    • go html/template
    • Google Closure Templates

    课后作业:XSS 攻击小游戏

    以下是几个 XSS 攻击小游戏,开发者在网站上故意留下了一些常见的 XSS 漏洞。玩家在网页上提交相应的输入,完成 XSS 攻击即可通关。

    在玩游戏的过程中,请各位读者仔细思考和回顾本文内容,加深对 XSS 攻击的理解。

    alert(1) to win

    prompt(1) to win

    XSS game



    分享到:


  • 相關文章: