【问题标题】:Phoenix/Elixir: CSRF with frontend applicationPhoenix/Elixir:带有前端应用程序的 CSRF
【发布时间】:2019-04-12 22:33:29
【问题描述】:

我将 用于前端,phoenix/elixir 用于 API 服务器,nginx 用于反向代理。

当我尝试制作用于上传文件的表单时,我遇到了困难。 我如何使用csrf

【问题讨论】:

  • 我发布了两个答案,一个禁用 CSRF,另一个使用它

标签: nuxt ajax file-upload elixir phoenix-framework nuxt.js


【解决方案1】:

使用 CSRF

CSRF 提供了很多安全优势,尤其是对于基于会话的 Web 应用程序,因此您可能继续使用它(如果您不使用类似 的东西)。这在前端 SPA 中通常会变得有点复杂,但基本过程是:

  1. 在初始请求时在您的网页上使用 get_csrf_token/0 呈现 CSRF 令牌(通常在隐藏字段或 JS 变量中)

  2. 在后续的 调用中读取值并将其发送回X-CSRF-TOKEN 请求标头中的服务器

  3. 一段时间后在服务器上重新生成一个新的 CSRF 令牌,并将其发送回现有请求的响应标头或仅针对该令牌的专用请求的响应中

  4. 将其保存在您的 web 应用中,以便下一个非GET 请求

(假设您的 SPA 不是一个完全独立的前端项目,并且至少部分由服务器渲染)


这里有一些其他资源:

【讨论】:

  • 我正在使用 cookie-session,cookie-session 是否提供足够的安全性?
  • 取决于您的用例,但简短的回答是“否”。为了让 SPA 更轻松,我个人建议禁用 CSRF,而是使用身份验证令牌。您应该在每个 ajax 调用的请求标头中显式发送身份验证令牌。
  • 两种方法:a) 如果它是一个完全独立的 SPA,auth 令牌将是更好的选择。 b) 如果前端是服务器渲染的,在不同的地方散布了一些 Nuxt/Vue 组件,那么坚持使用 CSRF。
  • 感谢您的提示!
【解决方案2】:

禁用 CSRF

如果您没有在 API 服务器中使用会话(例如,使用身份验证令牌之类的东西),最简单的选择是disable CSRF。您可以通过从路由器管道中移除 :protect_from_forgery 插头来做到这一点:

pipeline :browser do
  plug :accepts, ["html"]
  plug :fetch_session
  plug :fetch_flash
  # plug :protect_from_forgery ## REMOVE THIS
end

注意: SPA 通常使用:api 管道,默认情况下不包括在内

【讨论】:

    【解决方案3】:

    如果您只通过 AJAX 与后端交互,您可以禁用 CSRF 保护以支持自定义请求标头 per OWASP's advice

    【讨论】:

      猜你喜欢
      • 2017-01-04
      • 1970-01-01
      • 1970-01-01
      • 2017-12-04
      • 2014-08-15
      • 2016-11-07
      • 2016-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多