CSRF(Cross-Site Request Forgery,跨站要求捏造)攻击是一种利用用户已登录的身份在用户不知情的情况下对用户资产或权限造成伤害的攻击方式。常见的csrf攻击方式是在已登录的浏览器中,通过钓鱼邮件、假冒网站等方式欺骗用户点击链接,然后在用户不知情的情况下发起一些歹意要求,例如发起转账、删除数据等操作。
为了防御CSRF攻击,我们需要在服务端对要求进行验证,确保要求是用户确切发出的,而不是攻击者捏造的。目前大多数Web框架提供了CSRF防御功能,本篇文章会以Python Flask框架为例,介绍怎样在Flask中使用CSRF防御技能。
- 加入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验证要求的合法性。
- 在表单中加入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添加到表单中。
- 在路由函数中验证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,提高利用的安全性。
本文来源:https://www.yuntue.com/post/83811.html | 云服务器网,转载请注明出处!