【问题标题】:GAE blobstore upload fails with CSRF token missingGAE blobstore 上传失败,缺少 CSRF 令牌
【发布时间】:2015-05-04 18:41:41
【问题描述】:

我正在应用引擎上运行烧瓶。我需要让用户上传一些文件。出于安全原因,我在整个应用程序上都有csrf = CsrfProtect(app),使用flask_wtf 中的@csrf.exempt 装饰器免除了特定的url。 (隐式拒绝总比隐式允许好。)

使用 blobstore.create_upload_url 从 blobstore 获取上传 url 工作正常,但上传本身失败并显示 400CSRF token missing or incorrect.

这个问题在开发服务器上。我还没有在真实服务器上测试过它,因为它已经在生产中了。

如何免除/_ah/ 路径以便上传工作?

【问题讨论】:

    标签: python google-app-engine flask blobstore flask-wtforms


    【解决方案1】:

    我倾向于使用http://flask-wtf.readthedocs.org/en/latest/csrf.html 中概述的方法...:

    默认情况下,您还可以在所有视图中禁用 CSRF 保护,通过 将 WTF_CSRF_CHECK_DEFAULT 设置为 False,并有选择地调用 csrf.protect() 仅在您需要时。这也使您能够做一些 在检查 CSRF 令牌之前对请求进行预处理:

    该页面给出的原始示例是:

    @app.before_request
    def check_csrf():
        if not is_oauth(request):
            csrf.protect()
    

    但当然在您的情况下,您可以将其更改为:

    @app.before_request
    def check_csrf():
        if not request.path.startswith('/_ah/):
            csrf.protect()
    

    请注意,这是仍然默认拒绝 - 每个请求都需要 CSRF 保护...除了那些路径以 /_ah/ 开头的请求,完全符合您的要求。

    【讨论】:

    • 我收到一个错误:AttributeError: 'CsrfProtect' object has no attribute 'protect'。 'csrf' 变量应该是什么?
    • 显然protect方法在master分支上,但不在PyPI的最新版本0.11上。很奇怪。
    【解决方案2】:

    好吧,所以真正的问题是我给blobstore.create_upload_url()的successpath参数(即第一个)提供了一个绝对url,导致在加载根路径时通知成功的请求导致csrf错误(@987654322 @)。我将其更改为相对于根目录的路径,现在只需正常使用@csrf.exempt 即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-08
      • 2020-02-10
      • 2017-01-08
      • 2019-06-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-02
      • 2021-10-23
      相关资源
      最近更新 更多