JavaScript 语言 前端安全防护之CSRF防护 双提交cookie模式

JavaScript阿木 发布于 2025-06-25 6 次阅读


JavaScript 前端安全防护之CSRF防护:双提交cookie模式实现

随着互联网的快速发展,Web应用的安全问题日益突出。其中,跨站请求伪造(Cross-Site Request Forgery,CSRF)是一种常见的网络攻击手段,它允许攻击者冒充受害者发起恶意请求,从而盗取用户信息或执行非法操作。为了提高Web应用的安全性,本文将围绕JavaScript语言,探讨一种名为“双提交cookie模式”的CSRF防护技术。

CSRF攻击原理

CSRF攻击利用了用户已经认证的状态,通过在用户不知情的情况下,利用其认证信息发起恶意请求。攻击者通常会诱导用户访问一个包含恶意请求的网页,当用户访问该网页时,恶意请求会自动被发送到目标服务器。

以下是一个简单的CSRF攻击流程:

1. 用户登录到某个网站,并获取一个会话cookie。

2. 攻击者诱导用户访问一个恶意网页,该网页中包含一个指向目标网站的请求。

3. 由于用户已经登录,浏览器会自动携带cookie发送请求。

4. 目标网站服务器验证cookie,认为请求是合法的,并执行恶意操作。

双提交cookie模式

为了防止CSRF攻击,我们可以采用双提交cookie模式。该模式的核心思想是在用户的cookie中添加一个随机生成的token,并在每次请求时验证该token。以下是具体实现步骤:

1. 生成token

在用户登录成功后,服务器生成一个随机token,并将其存储在用户的cookie中。服务器端也需要存储这个token,以便后续验证。

javascript

// 服务器端生成token


function generateToken() {


return Math.random().toString(36).substring(2);


}

// 用户登录成功后,设置cookie


function setCookie(name, value, days) {


var expires = "";


if (days) {


var date = new Date();


date.setTime(date.getTime() + (days 24 60 60 1000));


expires = "; expires=" + date.toUTCString();


}


document.cookie = name + "=" + (value || "") + expires + "; path=/";


}

// 假设用户登录成功,生成token并设置cookie


var token = generateToken();


setCookie("csrfToken", token, 7);


2. 验证token

在用户发起请求时,服务器需要验证请求中携带的token是否与cookie中存储的token一致。如果不一致,则拒绝请求。

javascript

// 服务器端验证token


function getCookie(name) {


var nameEQ = name + "=";


var ca = document.cookie.split(';');


for(var i = 0; i < ca.length; i++) {


var c = ca[i];


while (c.charAt(0) === ' ') c = c.substring(1, c.length);


if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length);


}


return null;


}

function verifyToken(requestToken, storedToken) {


return requestToken === storedToken;


}

// 假设用户发起一个请求,请求中包含token


var requestToken = "123456"; // 从请求中获取token


var storedToken = getCookie("csrfToken"); // 获取cookie中的token

// 验证token


if (!verifyToken(requestToken, storedToken)) {


// token验证失败,拒绝请求


return false;


}


3. 前端实现

在客户端,我们需要确保每次发起请求时都携带token。以下是一个简单的示例:

javascript

// 前端发起请求时,携带token


function sendRequest(url, data) {


var xhr = new XMLHttpRequest();


xhr.open("POST", url, true);


xhr.setRequestHeader("Content-Type", "application/json");


xhr.onreadystatechange = function () {


if (xhr.readyState === 4 && xhr.status === 200) {


// 请求成功,处理响应数据


console.log(xhr.responseText);


}


};


xhr.send(JSON.stringify(data));


}

// 发起请求,携带token


var data = { token: "123456" }; // 从cookie中获取token


sendRequest("/api/submit", data);


总结

双提交cookie模式是一种有效的CSRF防护技术,它通过在用户的cookie中添加一个随机生成的token,并在每次请求时验证该token,从而防止攻击者利用用户的认证信息发起恶意请求。在实际应用中,我们可以根据具体需求对双提交cookie模式进行优化和扩展,以提高Web应用的安全性。