csrf token作用

本文介绍CSRF攻击的防御策略,通过在HTTP请求中加入随机token并由服务器验证,防止恶意请求。详细解释了如何在表单和Django项目中实现这一机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作用:

是防御CSRF攻击。

如何生成?

在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token,如果请求中没有 token 或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。

 

应用:

  • 表单中:添加隐藏字段csrf_token,来启用csrftoken验证
<form action="/add-name-v2" method="post">
        {% csrf_token %}
        <input type="text" name="name">
        <input type="submit" value="提交">
</form>

不能写到cookie中,因为浏览器在发出恶意csrf请求时,是自动带着你的cookie的。

 

  • Django项目中:

启用csrftoken验证:

from django.template.context_processors import csrf


def login(request):
    # omit the detail login logic
    return render(request, 'user/login.html', {'form': form, }, csrf(request))

在视图函数当中添加csrf_exempt装饰器,来取消csrftoken验证:

@csrf_exempt
def login(request):
  • ajax中的使用: 待补充

 

参考文档:

https://www.cnblogs.com/mengfangui/p/9075615.html

https://www.ibm.com/developerworks/cn/web/1102_niugang_csrf/#icomments

### CSRF Token 的生成、使用及安全性 #### 1. CSRF Token 的生成 CSRF Token 是一种随机生成的字符串,通常在用户会话初始化时由服务器生成并绑定到用户的会话中。生成方法可以包括使用加密算法结合时间戳、用户标识符(如用户ID)以及其他动态信息来确保其唯一性[^3]。例如,可以使用以下 Python 示例代码生成一个基于 HMAC 的 CSRF Token: ```python import hmac import hashlib import time import base64 def generate_csrf_token(secret_key, user_id): timestamp = str(int(time.time())) token_data = f"{user_id}:{timestamp}" hashed = hmac.new(secret_key.encode(), token_data.encode(), hashlib.sha256) return base64.urlsafe_b64encode(hashed.digest()).decode() ``` 此代码片段通过结合用户ID和时间戳生成一个 HMAC 哈希值,并将其编码为 Base64 格式以提高可读性。 #### 2. CSRF Token 的使用 CSRF Token 的主要用途是防止跨站请求伪造攻击。它通过以下方式实现: - **存储**:Token 通常存储在用户的会话中或作为 HTTP-only Cookie 发送到客户端。 - **传输**:在表单提交或 AJAX 请求中,Token 被嵌入到请求体或头部中[^3]。 - **验证**:服务器接收到请求后,将从请求中提取 Token 并与存储在会话中的 Token 进行比较。如果匹配,则认为请求合法;否则拒绝请求。 以下是 HTML 表单中嵌入 CSRF Token 的示例: ```html <form action="/submit" method="POST"> <input type="hidden" name="csrf_token" value="{{ csrf_token }}"> <button type="submit">Submit</button> </form> ``` 在 JavaScript 中通过 AJAX 请求发送 Token 的示例: ```javascript fetch('/submit', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRF-Token': '{{ csrf_token }}' }, body: JSON.stringify({ data: 'example' }) }); ``` #### 3. CSRF Token 的安全性 为了确保 CSRF Token 的安全性,需要遵循以下原则: - **绑定会话**:Token 必须与用户的会话绑定,避免被其他用户冒用。 - **HTTPS 传输**:所有包含 Token 的通信必须通过 HTTPS 加密,防止中间人攻击。 - **有效期管理**:Token 应具有合理的有效期,过期后需重新生成[^3]。 - **二次验证**:对于关键操作,建议结合短信验证码或 TOTP(基于时间的一次性密码)进行二次验证[^3]。 此外,还需要注意 Token 的存储位置。如果存储在 DOM 中,可能会受到 XSS 攻击的影响;因此推荐使用 HTTP-only Cookie 存储 Token。 #### 示例:CSRF Token 的校验逻辑 以下是一个简单的 Flask 后端校验 CSRF Token 的示例: ```python from flask import request, session, abort def validate_csrf_token(): submitted_token = request.form.get('csrf_token') or request.headers.get('X-CSRF-Token') if not submitted_token: abort(403, "Missing CSRF Token") stored_token = session.get('csrf_token') if not stored_token or submitted_token != stored_token: abort(403, "Invalid CSRF Token") ``` ### 总结 CSRF Token 是一种有效的防御机制,用于防止跨站请求伪造攻击。生成时应确保其唯一性和不可预测性,使用时需绑定用户会话并通过 HTTPS 传输,同时定期更新以提高安全性[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值