CORS配置能防CSRF吗?我是不是搞混了这两个概念?

南宫凌硕 阅读 5

最近在做登录功能,后端同事说要加CSRF防护,但我看网上很多人提到CORS。我就试着在Nginx里配了CORS头,比如Access-Control-Allow-Origin: https://myapp.com,但好像还是能被跨站请求伪造?

是不是CORS根本防不了CSRF啊?那我之前理解错了?求指点正确做法。

我来解答 赞 7 收藏
二维码
手机扫码查看
1 条解答
令狐曌煜
你确实搞混了这两个概念,CORS(跨域资源共享)和CSRF(跨站请求伪造)是两个完全不同的安全机制,解决的问题也不同。

CORS
CORS 是一种机制,它使用额外的 HTTP 头来告诉浏览器,允许一个 Web 应用从一个域访问另一个域的资源。简单来说,就是浏览器默认情况下会限制从一个源加载的文档或脚本如何与来自另一个源的资源进行交互。CORS 主要用于前端和后端之间的通信,确保安全性。

CSRF
CSRF 是一种攻击方式,攻击者诱导用户在已登录的状态下执行非预期的操作。最常见的 CSRF 攻击场景是用户已经登录某个网站 A,然后在没有退出的情况下访问了一个恶意网站 B,恶意网站 B 发起一个请求到网站 A,利用用户的登录状态执行一些操作,比如转账、修改信息等。

为什么 CORS 防不了 CSRF
CORS 和 CSRF 的作用对象不同。CORS 是针对浏览器的安全策略,防止的是未经授权的资源访问;而 CSRF 是针对服务器端的安全策略,防止的是未授权的操作执行。简单地说,CORS 是浏览器层面的安全机制,而 CSRF 是应用层面的安全机制。所以 CORS 完全不能防 CSRF。

正确的做法
要防止 CSRF 攻击,通常需要使用 CSRF Token。具体步骤如下:

1. 生成 CSRF Token
在用户登录时或者每次页面加载时,服务器生成一个唯一的、随机的 CSRF Token,并将其发送给客户端(通常是存储在 Cookie 中)。

2. 在表单中包含 CSRF Token
当用户提交表单时,将这个 CSRF Token 作为隐藏字段包含在表单数据中一起提交。

3. 验证 CSRF Token
服务器接收到请求后,验证请求中的 CSRF Token 是否与 Cookie 中存储的 Token 匹配。如果不匹配,则认为这是 CSRF 攻击,拒绝该请求。

示例代码

这里有一个简单的例子,使用 Python Flask 框架来展示如何实现 CSRF 保护:

from flask import Flask, request, session, render_template_string
import os

app = Flask(__name__)
app.secret_key = os.urandom(24) # 设置密钥用于加密 session 数据

@app.route('/')
def index():
# 生成 CSRF Token 并存储在 session 中
if 'csrf_token' not in session:
session['csrf_token'] = os.urandom(24).hex()
return render_template_string('''





''', csrf_token=session['csrf_token'])

@app.route('/submit', methods=['POST'])
def submit():
# 验证 CSRF Token
if request.form['csrf_token'] != session['csrf_token']:
return "CSRF Token mismatch", 403
# 处理正常请求逻辑
return "Data submitted successfully"

if __name__ == '__main__':
app.run(debug=True)


总结
CORS 和 CSRF 是两种不同的安全措施,各自解决不同的安全问题。为了防止 CSRF 攻击,你需要使用 CSRF Token 的方法来验证请求的合法性。希望这个解释能帮助你理解清楚这两个概念以及如何正确地配置 CSRF 防护。
点赞
2026-03-21 16:00