【发布时间】:2019-04-12 22:33:29
【问题描述】:
我将nuxt 用于前端,phoenix/elixir 用于 API 服务器,nginx 用于反向代理。
当我尝试制作用于上传文件的表单时,我遇到了困难。
我如何使用csrf?
【问题讨论】:
-
我发布了两个答案,一个禁用 CSRF,另一个使用它
标签: nuxt ajax file-upload elixir phoenix-framework nuxt.js
我将nuxt 用于前端,phoenix/elixir 用于 API 服务器,nginx 用于反向代理。
当我尝试制作用于上传文件的表单时,我遇到了困难。
我如何使用csrf?
【问题讨论】:
标签: nuxt ajax file-upload elixir phoenix-framework nuxt.js
CSRF 提供了很多安全优势,尤其是对于基于会话的 Web 应用程序,因此您可能继续使用它(如果您不使用类似 auth-token 的东西)。这在前端 SPA 中通常会变得有点复杂,但基本过程是:
在初始请求时在您的网页上使用 get_csrf_token/0 呈现 CSRF 令牌(通常在隐藏字段或 JS 变量中)
在后续的ajax 调用中读取值并将其发送回X-CSRF-TOKEN 请求标头中的服务器
一段时间后在服务器上重新生成一个新的 CSRF 令牌,并将其发送回现有请求的响应标头或仅针对该令牌的专用请求的响应中
将其保存在您的 web 应用中,以便下一个非GET 请求
(假设您的 SPA 不是一个完全独立的前端项目,并且至少部分由服务器渲染)
这里有一些其他资源:
【讨论】:
如果您没有在phoenix-framework 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 管道,默认情况下不包括在内
【讨论】:
如果您只通过 AJAX 与后端交互,您可以禁用 CSRF 保护以支持自定义请求标头 per OWASP's advice。
【讨论】: