应用程序骨架中的信息泄露风险
默认应用程序骨架包含 beforeRender() 方法,该方法位于 AppController 中,可能会导致应用程序中出现意外的信息泄露。 不安全的默认代码存在于应用程序骨架的 3.1.0 到 3.5.0 版本之间。
风险
默认 beforeRender 钩子会在控制器操作未定义 _serialize 视图变量的情况下,自动将所有视图变量序列化为 JSON/XML。 定义了 _serialize 变量的控制器方法将 **正常** 行为,只公开命名变量。
这种行为是由 AppController 和 ErrorController 加载 RequestHandlerComponent 触发的,它根据客户端的 Accept 标头配置要使用的视图类。 然后 AppController::beforeRender() 中的代码将允许所有视图变量在未明确列出任何变量的情况下进行序列化。
bake 生成的默认控制器会设置 _serialize 视图变量。 这有助于限制影响,但如果实体类配置不正确,仍然可能导致意外的信息泄露。
如何修复
您可以通过修改应用程序代码来修复潜在的信息泄露问题。 不幸的是,我们无法通过 CakePHP 或其应用程序骨架的补丁发布来为您解决此问题。
如果您在 src/Controller 目录中没有 ErrorController (CakePHP <= 3.3)
如果您使用的是 CakePHP 3.3.0 或更高版本,并且您的应用程序中没有 ErrorController,则应下载一个 ErrorController 并将其放到您的 src/Controller 目录中。
如果您不根据客户端请求使用 JSON/XML 响应
- 从 AppController 和 ErrorController 的 initialize() 方法中删除 $this->loadComponent('RequestHandler')。
- 从 AppController 的 beforeRender() 中删除 $this->set('_serialize', true);。
如果您根据客户端请求使用 JSON/XML 响应
- 从 AppController 的 beforeRender() 中删除 $this->set('_serialize', true);。
- 从所有不应返回 JSON/XML 的控制器操作中删除 $this->set('_serialize', [ (variable names) ])。
- 显式地将 $this->set('_serialize', [ (variable names) ]) 添加到您希望返回 JSON/XML 的控制器的一些操作中。
虽然我们没有收到任何关于信息泄露的报告,但此问题是由栗田隆志发现的,我们认为有必要公开此信息。