【问题标题】:Disable WTForms CSRF if access through certain routes如果通过某些路由访问,则禁用 WTForms CSRF
【发布时间】:2021-09-05 12:19:38
【问题描述】:

我正在使用 Flask-Login 和 Flask-WTF 进行 CSRF 保护。我想为 API 添加一些路由。由于request_loader 将用于 API(标头令牌,无 cookie),我想在这些路由上禁用 CSRF。

但是,一旦通过身份验证,用户之间就没有区别了。无法判断他们是使用带有user_loader 的cookie 还是使用带有request_loader 的标头登录的。

如何仅在 API 路由中使用表单时禁用 CSRF?或者如何防止 cookie 用户访问 API 路由?

【问题讨论】:

    标签: python flask flask-wtforms wtforms flask-login


    【解决方案1】:

    使用表单的Meta object,或者初始化meta参数来控制CSRF之类的东西。例如,如果您的 API 在 api 蓝图下:

    from flask_wtf import FlaskForm
    
    class APIForm(FlaskForm):
        class Meta:
            @property
            def csrf(self):
                return request.blueprint != "api"
    
    class DocumentForm(APIForm):
        ...
    
    # Or for a one-off use:
    
    form = UserForm(meta={"csrf": request.blueprint != "api"})
    

    或其他检查,具体取决于您的要求。


    无法判断他们是否使用 cookie 登录...

    您可以在加载用户的回调中做任何您想做的事情。例如,您可以在您的request_loader 中记录g.user_from_header = True。然后,您可以基于此启用csrf 属性,而不是基于蓝图。或者在 API 蓝图中添加一个 before_request 处理程序以在未设置时中止。

    @login_manager.request_loader
    def user_from_request(request):
        user = ...
        g.user_from_header = True
        return user
    
    @api_bp.before_request
    def require_user_from_header():
        if not g.get("user_from_header", False):
            abort(401)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-05
      • 2018-04-04
      • 2013-10-07
      • 1970-01-01
      • 1970-01-01
      • 2021-10-30
      相关资源
      最近更新 更多