Python框架中的CSRF防御技巧

2023-04-17 00:00:00 框架 技巧 防御

CSRF(Cross-Site Request Forgery,跨站请求伪造)攻击是一种利用用户已经登录的身份在用户不知情的情况下对用户资产或者权限造成伤害的攻击方式。常见的CSRF攻击方式是在已经登录的浏览器中,通过钓鱼邮件、假冒网站等方式骗取用户点击链接,然后在用户不知情的情况下发起一些恶意请求,例如发起转账、删除数据等操作。

为了防御CSRF攻击,我们需要在服务端对请求进行验证,确保请求是用户确实发出的,而不是攻击者伪造的。目前大多数Web框架提供了CSRF防御功能,本篇文章会以Python Flask框架为例,介绍如何在Flask中使用CSRF防御技巧。

  1. 加入CSRF防御中间件

在Flask中,我们可以使用第三方库Flask-WTF提供的CSRFProtect中间件来防御CSRF攻击。Flask-WTF是一个基于WTForms的Flask插件,它提供了表单验证、CSRF防御等功能,使得在处理Web表单时更为方便。

首先需要安装Flask-WTF库,可以通过pip安装:

pip install Flask-WTF

然后,在Flask应用中加入CSRFProtect中间件,示例代码如下:

from flask import Flask
from flask_wtf.csrf import CSRFProtect

app = Flask(__name__)
# 配置CSRF保护
app.config['SECRET_KEY'] = 'pidancode.com'
csrf = CSRFProtect(app)

其中,app.config['SECRET_KEY']是一个随机字符串,用于加密会话信息和cookie,提高安全性。在每个请求中,CSRFProtect会根据SECRET_KEY生成一个CSRF Token,并将其添加到表单中,客户端提交表单时携带此Token,服务端根据Token验证请求的合法性。

  1. 在表单中加入CSRF Token

为了防御CSRF攻击,需要在表单中添加一个名为“csrf_token”的隐藏字段,值为生成的CSRF Token。示例代码如下:

<form method="post" action="/">
  {{ form.hidden_tag() }}
  <input type="text" name="username">
  <input type="password" name="password">
  <button type="submit">登录</button>
</form>

在Flask中,我们可以使用WTForms库来生成表单,form.hidden_tag()会自动将生成的CSRF Token添加到表单中。

  1. 在路由函数中验证CSRF Token

在Flask中,CSRF Token会自动保存在请求头中的X-CSRFToken字段或者请求体中的_csrf字段。在路由函数中,可以使用csrf.protect()装饰器来验证CSRF Token的合法性,示例代码如下:

from flask_wtf.csrf import csrf

@app.route('/', methods=['GET', 'POST'])
# 验证CSRF Token
@csrf.protect
def login():
  if request.method == 'POST':
    # 进行登录验证
    username = request.form.get('username')
    password = request.form.get('password')
    if username == 'admin' and password == 'admin':
      return '登录成功'
    else:
      return '用户名或密码错误'
  else:
    # 显示登录表单
    return render_template('login.html')

在这个例子中,我们使用@csrf.protect装饰器来验证CSRF Token,如果Token不合法,则会返回状态码403 Forbidden。如果Token合法,则继续执行路由函数。在表单提交后,我们可以获取到用户名和密码,进行登录验证。如果登录成功,返回登录成功的消息,否则返回用户名或密码错误的消息。如果是GET请求,显示登录表单。

总结

在本篇文章中,我们介绍了如何在Python Flask框架中防御CSRF攻击。使用Flask-WTF库提供的CSRFProtect中间件,可以自动生成CSRF Token,并自动添加到表单中。在路由函数中,通过验证CSRF Token的合法性,增强应用的安全性。如果你正在开发基于Python Flask的Web应用,建议在表单中加入CSRF Token,提高应用的安全性。

相关文章