jsf - 打开新选项卡时使用受 JSF 保护的视图时出错
问题描述
我已经通过在 faces-config、protected-views 中列出各个页面来设置我的 Web 应用程序来防止 CSRF。
这在本地运行时效果很好,但在部署到服务器后,我最终在打开页面链接时遇到这些错误:
javax.faces.application.ProtectedViewException: JSF1099: Referer [sic] header value http://[redacted]/finance/commitmentregister/search.xhtml?javax.faces.Token=1534344211116 does not appear to be a protected view. Preventing display of viewId /finance/commitmentregister/view.xhtml
at com.sun.faces.lifecycle.RestoreViewPhase.maybeTakeProtectedViewAction(Unknown Source)
at com.sun.faces.lifecycle.RestoreViewPhase.execute(Unknown Source)
at com.sun.faces.lifecycle.Phase.doPhase(Unknown Source)
at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(Unknown Source)
at com.sun.faces.lifecycle.LifecycleImpl.execute(Unknown Source)
我们在本地和测试服务器上运行 Apache Tomcat 7。
编辑:
我注意到链接上生成的 url 如下所示:
http://.../page.xhtml?token=123&p=4
其中 token 是 CSRF javax.faces.Token 而 p 是发送的 url 参数。
错误消息显示带有令牌但没有 p 的 url。就像它期望带有令牌的 url 是 faces-config 中列出的受保护页面 url 一样。
也就是说,faces-config 有:
<protected-views>
<url-pattern>/page.xhtml</url-pattern>
</protected-views>
但它期待 page.xhtml?token=123
进一步编辑:
我们刚刚注意到只有在新标签页中打开页面时才会发生此错误。使用 target="_blank" 属性生成的链接。将 url 复制到剪贴板并将其粘贴到新选项卡地址栏中会正确加载页面。
解决方案
注意到它只在新标签上中断,给了我更多信息来研究这个问题。
将此添加到链接中可以修复它:
rel="noopener noreferrer"
推荐阅读
- slack - 使用 Slack Bot 提及访客?
- javascript - Javascript 不显示从 PHP 和 SQL Server 获得的数据
- android - 在 Android 错误中添加 geojson 文件(使用 try/catch 环绕)
- for-loop - 矩形的自动对齐取决于vb.net中的纸张大小
- c++ - AWS S3 C++:我应该使用 UploadFile() 还是 PutObject() 来上传文件?差异在哪里?
- mysql - 使用该现有表数据创建新表调用 Admin
- mongodb - 在区块链上保存电子商务数据的最佳方法是什么?
- php - 回显并返回打印不同的值
- c - 宏替换列表重新扫描替换
- bitcoin - 当我在 Coinbase 的钱包中收到比特币时,如何收到付款通知?