nginx - 为什么 Safari 在重定向时发送 Origin 标头?
问题描述
我正在使用 JSF2.2 开发一个 Web 应用程序,并使用受保护的视图进行 CSRF 保护。
我使用 Nginx 作为反向代理服务器。
我面临的问题是,当我作为对 POST 请求(PRG)的响应的重定向结果执行 GET 请求时,会发生以下错误。
当我使用 Chrome、Firefox 或 Edge 时,不会发生这种情况。
2020-03-02 16:30:33,623 SEVERE [javax.enterprise.resource.webcontainer.jsf.lifecycle] (default task-377) JSF1100: Origin [sic] header value https://example.com does not appear to be a protected view. Preventing display of viewId /some/protected/view.xhtml
2020-03-02 16:30:33,624 ERROR [my.project.commons.exception.logger.ExceptionLogFormatterImpl] (default task-377) SessionId=ZH1NL8D53vR6FLfG5hj4v3fNp3OVCByXBrzZJtGy RequestId=WNsDVWCm ContractNo=64811790 CSRFトークンエラー: javax.faces.application.ProtectedViewException: JSF1100: Origin [sic] header value https://example.com does not appear to be a protected view. Preventing display of viewId /some/protected/view.xhtml
这是因为:
- 在RestoreViewPhase上,JSF 检查 Origin 是否有效,然后失败。
(因为 JSF 会检查 Origin 的主机、端口和路径,而 Origin 没有路径。这对我来说看起来像是一个错误..) - Safari 在重定向时发送 Origin 标头。而 Chrome、Firefox 和 Edge 则没有。
所以问题是,为什么 Safari 在重定向时发送 Origin 标头?
查看规范,如果不是 CORS 请求,则不会在 GET 请求上设置 Origin 标头,实际上,Safari 不会在常规 GET 请求(不是重定向)上发送 Origin。
或者,这与反向代理有关吗?它是否可能使内部重定向类似于 CORS 请求?
这可以通过 Mac OS X 10.10.5 上的 Safari 10.1.2 和 iPad 上的 Safari 12.1.1重现,而 Mac OS X 10.15.2 上的 Safari 13.0.4 则 无法重现
解决方案
推荐阅读
- list - 如何在 OCaml 中获取指向列表尾部的指针?
- arrays - 阵列有多少个不同的分区?
- jmeter - 如何在jmeter中记录多协议脚本
- build - Xcode 10.2 在任意任务存档期间挂起
- javascript - Tinymce5手机回复背景色问题
- javascript - 显示 image1 的脚本,之后(随机 ms)显示 image2 并停止
- c# - 如何避免在数据库、ERP 上创建列
- angular - 如何在 HTML 中迭代 FormArray?
- reactjs - 如何在 ReactJS 中导航到同一页面上的特定 div?
- .net-core - Bot 在 Microsoft Teams 中的行为不同