为什么 p_auth 验证在 Liferay 6 中不起作用?

Why p_auth validation is not working in Liferay 6?

我正在使用 Liferay 6.2-ce-ga3、primefaces 6 和 JSF2.1。我为我的 portlet 启用了 CSRF 保护,在 liferay portal-ext.properties 和 portlet portal-ext.properties:

中添加了以下代码
auth.token.check.enabled=true
auth.token.impl=com.liferay.portal.security.auth.SessionAuthToken

此外,我在 portlet.xml

中添加了
<init-param>
  <name>check-auth-token</name>
  <value>true</value>
</init-param>

为了测试,我从我的 form url 中删除了 p_auth=<code>,然后我提交了表单,它成功了。这不好,我不应该允许没有令牌的请求。

  1. 我忘记在配置中添加过滤器了吗?
  2. liferay如何检查p_auth?
  3. 我应该像这样 tutorial 在我的 bean 中手动检查 p_auth 令牌吗?

Liferay 的 p_auth 令牌在 portlet 生命周期的 ACTION_PHASE 期间防止 CSRF。我相信它在 Liferay 6.2 中默认启用,因此您不需要为它配置任何东西。

必须存在 p_auth 标记才能在 ACTION_PHASE 期间正确提交表单。然而,the p_auth parameter has no effect during the RESOURCE_PHASE which is the phase where JSF Ajax form submissions are executed. So you may be dealing with a JSF Ajax request. Thankfully, JSF also has its own CSRF protection enabled by default in the view state。因此,当您使用 Liferay Faces 时,您可以安全地提交 Ajax 和非 Ajax 表单提交。

如果您确认 p_auth 在非 Ajax 表单提交期间没有效果,则可能存在安全漏洞(或您的配置存在问题)。您应该更新到最新版本的 Liferay Portal* 并重新测试。如果仍有问题,请报告 secure 问题:https://issues.liferay.com/secure/CreateIssue.jspa?pid=10952&issuetype=1.

*Liferay Portal 6.2 GA6 is the latest in the 6.2 line, and Liferay Portal 7.0 GA7 是总体上最新的 CE 版本。当然,有些 EE 版本可能也有更多错误修复。