• 主页

  • 投资

  • IT

    🔥
  • 设计

  • 销售

  • 共46篇

    python3.X - Web - Flask1.1.1

关闭

返回栏目

关闭

返回python3.X - Web - Flask1.1.1栏目

21 - Flask - 内置 - Csrf

作者:

贺及楼

成为作者

更新日期:2022-05-14 16:32:20

Flask - 内置 - Csrf

CSRF 意义

用户登录受信任的网址A,在本地生成了Cookie
在Cookie没有失效的情况下去访问了危险网站B
B可能会盗用你的身份,以你的名义去发送恶意请求,邮件,盗取你的账号,设置购买商品,造成你个人隐私泄露,造成财产安全。

防止 CSRF 攻击

步骤
在客户端向后端请求界面数据的时候,后端会往响应中的 cookie 中设置 csrf_token 的值
在 Form 表单中添加一个隐藏的的字段,值也是 csrf_token
在用户点击提交的时候,会带上这两个值向后台发起请求
后端接受到请求,以会以下几件事件:
从 cookie中取出 csrf_token
从 表单数据中取出来隐藏的 csrf_token 的值
进行对比
如果比较之后两值一样,那么代表是正常的请求,如果没取到或者比较不一样,代表不是正常的请求,不执行下一步操作

Csrf导入

旧:

  1. from flask_wtf.csrf import CsrfProtect
  2. csrf = CsrfProtect()
  3. def create_app():
  4. app = Flask(__name__)
  5. csrf.init_app(app)

新:

  1. from flask_wtf.csrf import CSRFProtect
  2. csrf = CSRFProtect(app)
  3. def create_app():
  4. app = Flask(__name__)
  5. csrf.init_app(app)

为了能够让所有的视图受到CSRF保护,需要扩展 CsrfProtect模块
需要为CSRF保护设置一个密钥,但通常情况下,和Flask应用的SECRET_KEY是一样的。
有的教程会导入CsrfProtect,flask1.0会淘汰掉
现在要导入CSRFProtect

定义没有通过csrf的视图 - 旧

  1. from app import csrf

蓝图引入

  1. @csrf.error_handler
  2. def csrf_error(reason):
  3. return render_template('csrf_error.html', reason=reason), 400

没有通过csrf验证会返回400

定义没有通过csrf的视图 - 新

  1. from flask_wtf.csrf import CSRFError
  2. BP = Blueprint('BP',__name__)
  3. @BP.errorhandler(CSRFError)
  4. def csrf_error(reason):
  5. return "重新登录或刷新"

不需要保护的视图加一个装饰器

  1. @csrf.exempt
  2. @app.route('/foo', methods=('GET', 'POST'))
  3. def my_handler():

exempt 豁免

html 引入

如果你设置的模板中存在表单,你只需要在表单中添加如下

  1. <form method="post" action="/">
  2. {{ form.csrf_token }}
  3. </form>

如果没有模板中没有表单,你仍然需要一个 CSRF 令牌:

  1. <form method="post" action="/">
  2. <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />