Web 前端資安風險 - CSRF 和 XSS
常見的 Web 前端安全漏洞像是:XSS
和 CSRF
XSS(跨站指令攻擊)
跨站指令攻擊(Cross-site Script),原本縮寫應該是 CSS,因為和 CSS 樣式表一樣,因此調整縮寫為 XSS,指的是攻擊者透過網頁開發留下的漏洞,注入惡意程式碼到網頁,讓使用者的瀏覽器上加載並執行惡意的程式碼。這可能導致偷取用戶的資訊、修改網頁內容,甚至遠程控制用戶的瀏覽器。
攻擊方式
XSS 攻擊可以分成三種:
反射型(非持久)
: 攻擊者將惡意代碼嵌入 URL,當用戶點擊該 URL 時,攻擊發生,例如:使用者發送獲取訂單列表的請求,黑客插入惡意程式碼,導致伺服器回傳時多回傳了使用者的帳號密碼。例如:使用者發送保存評論的請求,黑客插入惡意程式碼將評論者資訊也紀錄在資料庫,這時候,網路上其他使用者可以看到評論者的個資。儲存型(持久型)
: 攻擊者將惡意代碼存儲在網站的資料庫中,當用戶訪問該網頁時,攻擊發生DOM 型
:攻擊者通過修改網頁的 DOM 結構來實現攻擊,例如:伺服器回傳 response 時,黑客插入惡意程式,導致原本網頁上的 Logo 被換掉
其危害:儲存型 > 反射型 > DOM 型
防禦方式
防禦方式可分為三種:
輸入過濾:確保只接受合法的輸入,過濾和驗證用戶輸入的數據。例如:對 URL、查詢關鍵字、Post 數據等,僅接受指定長度範圍內、適當格式且符合預期字符的內容提交(使用者端和伺服器端都要)
輸出轉譯:在將用戶輸入的內容插入到網頁中之前,對其進行 HTML 實體編碼,以防止執行惡意代碼。
使用 HttpOnlyCookie:將 cookie 標記為 HttpOnly,以防止 JavaScript 使用 document.cookie 取得 cookie
CSRF(跨站請求偽造)
跨站請求偽造(Cross-site request forgery),又被稱為 one-click 攻擊 或者 session riding,指的是偽造請求(通常會是一個連結),誘使使用者點擊,一旦點擊之後,就可以欺騙瀏覽器、讓網站以為是使用者本人的操作。
例如:使用者在網站 A 透過登入了銀行系統,此時帳號密碼已存在瀏覽器的 cookie 中,這時,同時打開惡意網站 B 的某連結,該連結是一個偽造請求,在使用者為登入的狀態下,點擊該連結就發送了自己不知道的請求到 A 網站。
簡單來說,攻擊成功要滿足兩個條件:
- 該網站沒有進行防止 CSRF 處理,導致請求容易被偽造
- 使用者要在登入狀態下點擊惡意連結
防禦方式
請求參數增加 token 並驗證: 常見的作法。透過每次請求參數加上隨機生成的 token,而伺服器每次對這個隨機碼進行驗證,確保請求是合法的。
驗證 HTTP Referer:確保請求來源合法。Referer 紀錄了該 HTTP 請求的來源地址。然而,此種方式有缺點,就是 Referer 存在偽造的風險,若瀏覽器設定發送請求不提供 Referer 時,網站會拒絕合法使用者的訪問
使用 POST 而不是 GET:敏感操作使用 POST 請求,而不是 GET 請求
二次驗證:對某些敏感操作進行二次驗證,例如:修改帳號時,需要輸入舊密碼
安全的登入管理
- 不要在使用者端儲存機密資訊(像是在 cookie 儲存帳號密碼)
- 一定時間內無操作則自動登出
- 關閉瀏覽器時自動登出
XSS V.S. CSRF
CSRF 利用使用者的權限完成攻擊,但攻擊者並不獲得用戶的權限;而 XSS 直接竊取了使用者的權限,然後進行操作或破壞。