【python】深入探讨flask是如何预防CSRF攻击的
    		       		warning:
    		            这篇文章距离上次修改已过442天,其中的内容可能已经有所变动。
    		        
        		                
                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攻击。
评论已关闭