【python】深入探讨flask是如何预防CSRF攻击的
Flask使用CSRF(跨站请求伪造)令牌来防止恶意网站伪造用户的请求。当用户访问Flask应用时,Flask会为每个会话生成一个唯一的CSRF令牌,并将其作为隐藏字段嵌入到表单中。当用户提交表单时,Flask会验证提交的CSRF令牌与存储在用户会话中的令牌是否一致,以此来确认请求是由用户自己的会话发起的,从而防止伪造请求。
以下是一个简单的Flask应用示例,演示了如何集成和使用CSRF保护:
from flask import Flask, render_template, session, request
from wtforms import Form, TextField, BooleanField, HiddenField
from wtforms.csrf.core import CSRF
from wtforms.validators import Required
app = Flask(__name__)
app.secret_key = 'your_secret_key'
csrf = CSRF(app)
class MyForm(Form):
name = TextField('Name', validators=[Required()])
submit = SubmitField('Submit')
@app.route('/')
def index():
if 'csrf_token' not in session:
session['csrf_token'] = csrf.generate_csrf()
return render_template('index.html', form=MyForm())
@app.route('/submit', methods=['POST'])
def submit():
form = MyForm(request.form)
if form.validate():
return 'Form validated!'
return 'Form did not validate', 400
if __name__ == '__main__':
app.run(debug=True)
在HTML模板中,CSRF令牌会自动作为隐藏字段嵌入到表单中:
<!-- index.html -->
<form method="post">
{{ form.csrf_token }}
{{ form.name.label }} {{ form.name }}
{{ form.submit() }}
</form>
当用户访问/
路径时,会生成一个CSRF令牌并存储在会话中。当用户提交表单到/submit
路径时,Flask会检查CSRF令牌的有效性。如果令牌不匹配或者不存在,请求会被拒绝,从而防止了CSRF攻击。
评论已关闭