前端安全系列(一):如何防止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



    分享到:


  • 相關文章: