我为我的自定义TYPO3扩展实现了CSRF保护(根据文档),对于非认证的前端访问者和后端管理员的前端也可以正常工作。但我注意到一个奇怪的问题,如果非管理员的后端用户尝试在前端插件中使用表单,则会引发错误:
PHP Catchable Fatal Error: Argument 1 passed to TYPO3\CMS\Core\FormProtection\FormProtectionFactory::getMessageClosure() must be an instance of TYPO3\CMS\Lang\LanguageService, null given
我测试了TYPO3 V.7.6.10和7.6.14。这个错误在两个版本中都出现。
我查看了FormProtectionFactory中的源代码,似乎 $GLOBALS['Lang']
在FE中为管理员用户初始化,但对于普通后端用户为空。在BE中,两个用户组都可以访问其他CSRF受保护的表单。
根据LanguageService的官方参考,LanguageService通常只在BE中可用:
这个类通常作为全局变量$GLOBALS['LANG']实例化,它只在后台和特定情况下在前台可用。
有人知道这些特定情况是什么吗?当然,可以从BE注销并以未经身份验证的用户访问表单,但这显然非常烦人。我认为这是预期行为,但我不明白为什么问题仅出现在非管理员身上。也许有人有想法,如何使表单对非管理员后端用户在FE中也可用?
非常感谢任何帮助。
谢谢!
为了完整起见,这是我的CSRF令牌生成器调用,但我认为“问题”在TYPO3本身(或者是预期行为):
$this->view->assign("csrfToken", FormProtectionFactory::get()->generateToken($this->extensionName,
$this->controllerContext->getRequest()->getControllerActionName(), $additionalObject));