2

我创建了一个应该同时响应移动设备和网络浏览器的 API。例如,/web/toys对于 Web 和/API/toysJSON 响应。我正在使用 JW 令牌作为身份验证手段。
我在 HTML 和后台显示表单,我调用 jQuery Ajax 的方法来发布到我的 API。我将 access_tokens 保存在会话 cookie 中。为了防止 CSRF 攻击,我使用了 Flask-JWT-Extended。

当我装饰视图@jwt_required并将 CSRF 设置为 Truemissing JWT in headers and cookies时,即使设置和传输 cookie,我也会得到 。查了源码,发现X-CSRF-TOKEN在请求头中设置很重要。
但是,由于端点同时响应 GET 和 POST 调用,我如何在 GET 调用中设置标头而不使用 jQuery 加载完整页面。?
基本上,我想在网页上显示表单,当用户单击提交时,使用 jQuery 将表单传输到现有 API。
如果有更好的处理方式,我很想知道。
谢谢!

4

1 回答 1

2

Flask-JWT-Extended 的作者在这里。正如您所发现的,通过此扩展,我们目前正在为每种类型的请求进行 CSRF 保护。但是,CSRF 保护仅在状态更改请求时才真正需要:请参阅:https ://security.stackexchange.com/questions/115794/should-i-use-csrf-protection-for-get-requests/115800

保护所有请求类型的好处是,如果您有一个端点错误地更改了 GET 请求中的状态(没有技术原因这不可能发生),它就会容易受到 CSRF 攻击。现在,如果后端设计得更“符合规范”,这不再是问题。听起来我需要更新 Flask-JWT-Extended 以允许忽略对某些类型的请求的 CSRF 保护,就像 Flask-WTF 的操作方式一样。今天我会努力更新这个。

或者,如果您的后端直接提供 JSON 而不是 html(例如 REST api 后端和 javascript 前端),您可以使用 Ajax 使用 CSRF 令牌执行 GET 请求。在这个用例中,我们可以按照这些思路使用 Ajax 调用。

   get (options) {
     let self = this
     $.ajax({
       method: 'GET',
       dataType: 'json',
       headers: {
         'X-CSRF-TOKEN': Cookies.get('csrf_access_token')
       },
       url: "some_url",
       success (result, statusText) {
         // Handle success
       },
       error (jqXHR, textStatus, errorThrown) {
         //handle error
       }
     })
   }

编辑:如果 CSRF 令牌不存在并且您同时使用 JWT 的标头和 cookie,我还想保留 CSRF 错误消息。可以在此处跟踪这两个方面的进展:

于 2017-02-02T16:08:51.303 回答