TYPO3 Extbase:非管理员用户前端CSRF-表单保护失败

5

我为我的自定义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));

有趣的问题。我曾经读到过7.6版本之后前端需要手动进行CSRF保护,但是所有的文档都只描述了后端的保护。 - Paul Beck
没错,据我所知。我是通过查看FormProtectionFactory类的实现(前端也有一个实现)来实现它的,但文档会很有用。 - Valentin B.
1个回答

2
TYPO3开发者认为CSRF仅适用于已登录的用户,但在这种情况下并非如此,因此匿名用户无法在前端使用CSRF功能。请参见https://forge.typo3.org/issues/77403

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接