Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php TYPO3 Extbase:前端中非管理员用户的CSRF FormProtection失败_Php_Typo3_Extbase - Fatal编程技术网

Php TYPO3 Extbase:前端中非管理员用户的CSRF FormProtection失败

Php TYPO3 Extbase:前端中非管理员用户的CSRF FormProtection失败,php,typo3,extbase,Php,Typo3,Extbase,我已经为我的自定义TYPO3扩展实现了CSRF保护(根据),它对于未经身份验证的前端访问者和前端的后端管理员都很好地工作。我注意到的一件奇怪的事情是,如果非管理员后端用户尝试在前端插件中使用表单,则会引发错误: PHP Catchable Fatal Error: Argument 1 passed to TYPO3\CMS\Core\FormProtection\FormProtectionFactory::getMessageClosure() must be an instance of

我已经为我的自定义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本身(或预期行为):


TYPO3开发人员认为CSRF只适用于已登录的用户,而这里的情况并非如此,因此CSRF功能根本无法在前端用于匿名用户


参见

有趣的问题。我读过一些关于7.6版以后需要在前端使用手动CSRF保护的文章,但是所有文档都只在后端描述了这一点。是的,很好。我已经通过查看FormProtectionFactory类实现了它(也有一个前端实现可用),但是文档将非常有用。
$this->view->assign("csrfToken", FormProtectionFactory::get()->generateToken($this->extensionName,
        $this->controllerContext->getRequest()->getControllerActionName(), $additionalObject));