CSRF(Cross-Site Request Forgery,跨站请求伪造)令牌是一种安全机制,用于防止恶意网站利用用户已登录的会话来执行未经授权的操作。CSRF令牌是服务器生成的一个唯一、不可预测的值,嵌入在表单或HTTP请求中,服务器在处理请求时会验证该令牌的有效性。
import secrets
from flask import Flask, session, render_template_string
app = Flask(__name__)
app.secret_key = 'your-secret-key'
@app.route('/form')
def show_form():
# 生成CSRF令牌并存储在会话中
if 'csrf_token' not in session:
session['csrf_token'] = secrets.token_hex(16)
return render_template_string('''
<form action="/submit" method="post">
<input type="hidden" name="csrf_token" value="{{ session.csrf_token }}">
<input type="text" name="data">
<button type="submit">Submit</button>
</form>
''')
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
public class CsrfTokenGenerator {
private static final String HMAC_ALGORITHM = "HmacSHA256";
private static final String SECRET_KEY = "your-secret-key";
public static String generateToken(String sessionId) {
try {
SecretKeySpec signingKey = new SecretKeySpec(SECRET_KEY.getBytes(), HMAC_ALGORITHM);
Mac mac = Mac.getInstance(HMAC_ALGORITHM);
mac.init(signingKey);
byte[] rawHmac = mac.doFinal(sessionId.getBytes());
return Base64.getEncoder().encodeToString(rawHmac);
} catch (NoSuchAlgorithmException | InvalidKeyException e) {
throw new RuntimeException("Failed to generate CSRF token", e);
}
}
}
// 前端生成并设置CSRF令牌
function setCsrfCookie() {
const token = generateRandomToken();
document.cookie = `csrf_token=${token}; Path=/; Secure; SameSite=Strict`;
return token;
}
function generateRandomToken() {
const array = new Uint32Array(10);
window.crypto.getRandomValues(array);
return array.join('');
}
// 在表单提交时包含令牌
document.querySelector('form').addEventListener('submit', function(e) {
const token = getCookie('csrf_token');
const input = document.createElement('input');
input.type = 'hidden';
input.name = 'csrf_token';
input.value = token;
this.appendChild(input);
});
原因:
解决方案:
解决方案:
// 从cookie中获取CSRF令牌
function getCookie(name) {
let cookieValue = null;
if (document.cookie && document.cookie !== '') {
const cookies = document.cookie.split(';');
for (let i = 0; i < cookies.length; i++) {
const cookie = cookies[i].trim();
if (cookie.substring(0, name.length + 1) === (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
// 设置AJAX请求头
const csrftoken = getCookie('csrftoken');
fetch('/api/endpoint', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRFToken': csrftoken
},
body: JSON.stringify({data: 'value'})
});
解决方案:
通过合理实现CSRF令牌机制,可以有效防止跨站请求伪造攻击,保护Web应用的安全。
没有搜到相关的文章