我已经为我的自定义TYPO3扩展程序实现了CSRF保护(根据documentation),它对未经过身份验证的前端访问者以及前端的后端管理员工作得很好。我注意到一个奇怪的事情是,如果非管理员后端用户试图在前端插件中使用表单,则会抛出错误:
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中的admin用户初始化的,但对于普通的后端用户来说是空的。在BE中,两个用户组都可以访问其他CSRF保护表单。
根据LanguageService的official reference,LanguageService通常只在BE中提供:
此类通常被实例化为全局变量$ GLOBALS ['LANG']它仅在后端可用,并且在前端的某些情况下
有谁知道这些特定情况是什么?当然可以从BE注销并以未经身份验证的用户身份访问表单,但这显然非常烦人。我认为这是预期的行为,但我不明白为什么这个问题只发生在非管理员身上。也许有人有想法,如何在富裕的非管理员后端用户中使用该表单?
非常感谢任何帮助。
谢谢!
为了完整起见,我调用了CSRF令牌生成器,但我认为'问题'在TYPO3本身(或者是预期的行为):
$this->view->assign("csrfToken", FormProtectionFactory::get()->generateToken($this->extensionName,
$this->controllerContext->getRequest()->getControllerActionName(), $additionalObject));
答案 0 :(得分:0)
TYPO3开发人员认为CSRF仅适用于已登录的用户,而这种情况并非如此,因此匿名用户的前端根本无法使用CSRF功能。