1. 程式人生 > >IBM Security Appscan漏洞--跨站點請求偽造

IBM Security Appscan漏洞--跨站點請求偽造

漏洞介紹:
可能會竊取或操縱客戶會話和 cookie,它們可能用於模仿合法使用者,從而使黑客能夠以該使用者身份檢視或變更使用者記錄以及執行事務
將 HTTP 頭設定為“http://bogus.referer.ibm.com
解決辦法:
驗證HTTP Referer欄位
根據HTTP協議,在HTTP頭中有一個欄位叫Referer,它記錄了該HTTP請求的來源地址。在通常情況下,訪問一個安全受限頁面的請求必須來自於同一個網站。比如某官網是通過使用者訪問http://www.test/test頁面完成,使用者必須先登入www.test,然後通過點選頁面上的按鈕來觸發某某事件。當用戶提交請求時,該請求的Referer值就會是按鈕所在頁面的URL(本例中,通常是以www. test域名開頭的地址)。而如果攻擊者要對網站實施CSRF攻擊,他只能在自己的網站構造請求,當用戶通過攻擊者的網站傳送請求到網站時,該請求的Referer是指向攻擊者的網站。因此,要防禦CSRF攻擊,網站只需要對於每一個頁面請求驗證其Referer值,如果是以www. test開頭的域名,則說明該請求是來自網站自己的請求,是合法的。如果Referer是其他網站的話,就有可能是CSRF攻擊,則拒絕該請求。
程式碼示例:


在伺服器端的攔截器必不可少,它將負責檢查到來的請求是否符合要求,然後視結果而決定是否繼續請求或者丟棄。在 Java 中,攔截器是由 Filter 來實現的。我們可以編寫一個 Filter,並在 web.xml 中對其進行配置,使其對於訪問所有需要 CSRF 保護的資源的請求進行攔截。
在 Filter 中驗證 Referer

以下程式碼先取得 Referer 值,然後進行判斷,當其非空並以 www.test 開頭時,則繼續請求,否則的話可能是 CSRF 攻擊,轉到 error.jsp 頁面。

// 從 HTTP 頭中取得 Referer 值
String referer = request.
getHeader("Referer"); // 判斷 Referer 是否以 bank.example 開頭 if (referer == null) { log.error("您的違規操作將被中止、記錄並保留追溯權利!" + referer); request.getRequestDispatcher("index.jsp").forward(request, response); return false; } if (!(referer.trim().startsWith(YuMing))) { log.error("您的違規操作將被中止、記錄並保留追溯權利!"
+ referer); throw new CustomException("您的違規操作將被中止、記錄並保留追溯權利!"); }

如有更好的方法,歡迎在評論中指出,與大家分享。謝謝