當前位置: 首頁> 最新文章列表> CSRF攻擊防禦策略與實現方法詳解

CSRF攻擊防禦策略與實現方法詳解

M66 2025-06-21

CSRF攻擊防禦策略與實施方法

隨著網絡技術的不斷發展,網絡安全風險也隨之增加。跨站請求偽造(CSRF)攻擊成為了當前互聯網應用程序面臨的主要威脅之一。本文將介紹CSRF攻擊的基本原理,以及常用的防御手段,並進一步解釋其實施方法,並附有相關代碼示例。

CSRF攻擊原理

CSRF攻擊利用用戶已經認證過的會話來進行惡意操作。攻擊者通過誘導用戶點擊惡意鏈接或訪問惡意網站,使其在受害者不知情的情況下發送偽造的請求。當用戶在受信任網站登錄並認證成功後,瀏覽器會在發送請求時自動攜帶相應的身份憑證,導致攻擊者能夠冒充用戶發送請求,執行惡意操作。

防禦策略

(1)同源檢測

同源檢測是常見的防禦CSRF攻擊的手段之一,通過比較請求的來源和目標地址是否屬於同一域名的方法來判斷請求的合法性。在服務器端進行驗證,如果來源域名和目標域名不一致,則拒絕請求。

示例代碼:

@RequestMapping("/transfer")
public String transferMoney(HttpServletRequest request) {
    String origin = request.getHeader("Referer");
    String target = request.getServerName();
    if (!origin.equals(target)) {
        return "Illegal Request";
    }
    // 業務邏輯處理...
    return "Transfer Successful";
}

(2)添加CSRF Token

添加CSRF Token也是常用的防御手段之一。服務器在返回HTML頁面時,生成一個唯一的Token,並將其嵌入到表單中或者作為Cookie下發到客戶端。表單提交時,將Token一併發送到服務器端。服務器驗證Token是否匹配,如果不匹配,則拒絕請求。

示例代碼:

@RequestMapping("/transfer")
public String transferMoney(HttpServletRequest request, @RequestParam("csrfToken") String csrfToken) {
    HttpSession session = request.getSession();
    String storedToken = (String) session.getAttribute("csrfToken");
    if (!csrfToken.equals(storedToken)) {
        return "Invalid Token";
    }
    // 業務邏輯處理...
    return "Transfer Successful";
}

(3)同步請求與異步請求

異步請求使用AJAX等技術,在不刷新頁面的情況下向服務器發送請求,這就導致了CSRF攻擊難以阻止。因此,對於涉及到敏感操作的請求,最好使用同步請求,以便能與服務器建立起更加可靠的會話。

實施方法

(1)驗證請求來源並添加同源檢測

在後端服務中,通過獲取請求頭的Referer字段,根據後台邏輯判斷請求是否合法。如果請求來源與目標不一致,則拒絕請求。

示例代碼:

@RequestMapping("/transfer")
public String transferMoney(HttpServletRequest request) {
    String origin = request.getHeader("Referer");
    String target = request.getServerName();
    if (!origin.equals(target)) {
        return "Illegal Request";
    }
    // 業務邏輯處理...
    return "Transfer Successful";
}

(2)添加CSRF Token

在向前端發送HTML頁面時,生成一個唯一的Token,並將其嵌入到表單中或者作為Cookie下發到客戶端。前端在提交請求時,將Token一併發送到服務器端,服務器驗證Token是否匹配,以此判斷請求的合法性。

示例代碼:

@RequestMapping("/transfer")
public String transferMoney(HttpServletRequest request, @RequestParam("csrfToken") String csrfToken) {
    HttpSession session = request.getSession();
    String storedToken = (String) session.getAttribute("csrfToken");
    if (!csrfToken.equals(storedToken)) {
        return "Invalid Token";
    }
    // 業務邏輯處理...
    return "Transfer Successful";
}

總結

CSRF攻擊是一種常見且具有危害性的攻擊方式,但通過一些有效的防禦策略可以提高應用程序的安全性。本文介紹了同源檢測和添加CSRF Token這兩種常用的防御手段,同時給出了實施方法的示例代碼。在開發應用程序時,我們應當根據具體情況選擇適合的防禦策略並正確實施,以保障用戶數據的安全。