我正在使用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>
为了进行测试,我从p_auth=<code>
网址中删除了form
,然后提交了表单,该表单可以正常工作。那不好,我不应该在没有令牌的情况下允许请求。
答案 0 :(得分:1)
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是执行JSF Ajax表单提交的阶段。因此,您可能正在处理JSF Ajax请求。幸运的是,JSF also has its own CSRF protection enabled by default in the view state。因此,当您使用Liferay Faces时,无论使用Ajax表单提交还是使用非Ajax表单提交,CSRF都是安全的。
如果您确认p_auth
在非Ajax表单提交过程中无效,则可能存在安全漏洞(或您的配置存在问题)。您应该更新到最新版本的Liferay Portal *并重新测试。如果您仍然遇到问题,请报告安全问题:https://issues.liferay.com/secure/CreateIssue.jspa?pid=10952&issuetype=1。
* Liferay Portal 6.2 GA6是6.2行中的最新版本,而Liferay Portal 7.0 GA7是整体上最新的CE版本。当然,有些EE版本可能也修复了许多错误。