8

我从食谱中读到(第 4.2 节)

如果您使用 CakePHP 的 ORM 方法(例如 find() 和 save())和适当的数组表示法(即 array('field' => $value))而不是原始 SQL,CakePHP 已经保护您免受 SQL 注入。对于 XSS 的清理,通常最好将原始 HTML 保存在数据库中而不进行修改,并在输出/显示时清理。

那么我们确定我们永远不需要针对 SQL 手动清理用户数据,只要我们限制为 find() 和 save() 等方法吗?特别是,如果我直接从 $_POST 而不是从 $this->data 获取数据,这是真的吗?换句话说,假设我使用 $this->data 进行 find() 查询。那么在编写数组 $this->data 或编写 find() 查询时,CakePHP 会针对 SQL 进行清理吗?

我的第二个问题是对要显示的数据进行清理。Sanitize::html 是幂等的吗?那么,我可以在我的 beforeSave() 方法中使用它,还是在我第二次保存时它会中断,因为它会再次应用并给出新的结果?

4

3 回答 3

6

关于这个问题:

在编写数组 $this->data 或编写 find() 查询时,CakePHP 会针对 SQL 进行清理?

Cakephp 不会在控制器中清理 $this->data,如果您检查蛋糕代码,在 Dispatcher::parseParams() http://api13.cakephp.org/view_source/dispatcher/#line-244中,您会看到当$_POST 被复制到控制器数据中,值没有被清理。

但是,不建议使用 $_POST,因为您将失去使用表单助手时获得的所有蛋糕的魔力

于 2010-10-30T18:07:23.483 回答
0

哇 - 如果您直接从 $_POST获取数据,那么如果您计划在未来的任何页面上发布数据,那么您绝对应该对数据进行清理。我记得大约 2 年前的一次大恐慌,因为据透露,由于用于登录的选择查询的布局,简单的 SQL 注入将允许蛋糕 1.1 站点被利用。

然而,许多用户故意将旧规则用于将在 SQL 中使用的输入字段:

“为了防止 SQL 注入,用户输入不能直接嵌入到 SQL 语句中。相反,用户输入必须被转义......”

所以,是的,这是一个单独的问题,但同样的想法——虽然 CakePHP 是老板,并且为我们做了很多,我们不应该盲目相信它的安全性。自己清理数据对性能的影响几乎为零。所以就去做吧。

于 2010-01-30T14:07:36.210 回答
0

不,它不会影响你。您可以在before_save(). 如果您使用任何自定义查询功能,即您可以使用自己的查询的功能,您将需要清理

于 2010-09-08T08:24:00.387 回答