从事 Phabricator 扩展的工作让我回到了 PHP 的世界,这是我在过去几年中仅通过 WordPress 插件和博客主题接触过的一种语言。 尽管远离了这门语言,我还是能够相当快地跳回去,并感到一种“回到家”的舒适感……直到我意识到 Phabricator 没有大量记录,我需要深入研究源代码弄清楚如何完成几乎每一项任务。
一个让我困惑了一段时间的错误如下:
您正在尝试将一些数据保存到 Phabricator,但您的浏览器发出的请求包含不正确的令牌。 重新加载页面并重试。 您可能需要清除 cookie。
我试图创建并保存一个 PhabricatorAuthTemporaryToken
例如,为了允许通过第三方服务登录,并且该服务对 Phabricator 的请求是在后台发出的,因此没有 PHCID,因为没有会话,因此 CSRF 令牌无效。 本质上,我需要一种无需 CSRF 验证(通过 PHCID)步骤即可写入 Phabricator 的方法。 解决方案很简单:
// Turn off CSRF check
$unguarded = AphrontWriteGuard::beginScopedUnguardedWrites();
// Save token
id(new PhabricatorAuthTemporaryToken())
->setTokenResource($transaction_code)
// ...
->save();
// Turn CSRF check back on
unset($unguarded);
AphrontWriteGuard::beginScopedUnguardedWrites()
允许我打开 CSRF 检查,保存令牌,然后通过重新打开 CSRF 检查 unset
. 代码量少,但花了很长时间才找到!
我喜欢像 Phabricator 这样的高级库坚持这些安全检查,而无需开发人员明确地这样做; 我也喜欢暂时关闭此检查很容易。 当我遇到问题时,我一定会分享更多 PHP / Phabricator 技巧!