用户登录受信任的网址A,在本地生成了Cookie
在Cookie没有失效的情况下去访问了危险网站B
B可能会盗用你的身份,以你的名义去发送恶意请求,邮件,盗取你的账号,设置购买商品,造成你个人隐私泄露,造成财产安全。
步骤
在客户端向后端请求界面数据的时候,后端会往响应中的 cookie 中设置 csrf_token 的值
在 Form 表单中添加一个隐藏的的字段,值也是 csrf_token
在用户点击提交的时候,会带上这两个值向后台发起请求
后端接受到请求,以会以下几件事件:
从 cookie中取出 csrf_token
从 表单数据中取出来隐藏的 csrf_token 的值
进行对比
如果比较之后两值一样,那么代表是正常的请求,如果没取到或者比较不一样,代表不是正常的请求,不执行下一步操作
旧:
from flask_wtf.csrf import CsrfProtect
csrf = CsrfProtect()
def create_app():
app = Flask(__name__)
csrf.init_app(app)
新:
from flask_wtf.csrf import CSRFProtect
csrf = CSRFProtect(app)
def create_app():
app = Flask(__name__)
csrf.init_app(app)
为了能够让所有的视图受到CSRF保护,需要扩展 CsrfProtect模块
需要为CSRF保护设置一个密钥,但通常情况下,和Flask应用的SECRET_KEY是一样的。
有的教程会导入CsrfProtect,flask1.0会淘汰掉
现在要导入CSRFProtect
from app import csrf
蓝图引入
@csrf.error_handler
def csrf_error(reason):
return render_template('csrf_error.html', reason=reason), 400
没有通过csrf验证会返回400
from flask_wtf.csrf import CSRFError
BP = Blueprint('BP',__name__)
@BP.errorhandler(CSRFError)
def csrf_error(reason):
return "重新登录或刷新"
@csrf.exempt
@app.route('/foo', methods=('GET', 'POST'))
def my_handler():
exempt 豁免
如果你设置的模板中存在表单,你只需要在表单中添加如下
<form method="post" action="/">
{{ form.csrf_token }}
</form>
如果没有模板中没有表单,你仍然需要一个 CSRF 令牌:
<form method="post" action="/">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />