codeigniter 查询生成器和活动记录 sql 注入

Posted

技术标签:

【中文标题】codeigniter 查询生成器和活动记录 sql 注入【英文标题】:codeigniter query builder and active record sql injection 【发布时间】:2017-04-09 17:32:37 【问题描述】:

自从我在 SO 中提出最后一个问题以来,我一直在阅读一些关于如何防止 sql 注入的内容,并且许多人提到了活动记录类。但是当我谷歌它时,它只存在于codeigniter 2中。

所以我的问题是:

    codeigniter 3 中的 Query Builder 类是 Active Record 类的升级版本,还是它们有不同的用途?

    (通常)使用像$this->where('field', $foo); 这样的查询构建器类方法而不是$this->where("field = '$foo'"); 来防止sql 注入是否足够?

附:我正在使用 codeigniter 3 和 mysql

【问题讨论】:

看看:***.com/questions/1615792/… 是的,我在提问之前已经阅读了这个问题。这个问题在这里没有回答我的任何一个问题。那里有太多不同的意见,无法得出任何结论。 【参考方案1】:

1- ActiveRecord 在 Codeigniter 2 中,但在 Codeigniter 3 中,您使用的是 QueryBuilder。这两个类为你做同样的工作,也许 QueryBuilder 是 ActiveRecord 的改进版本。在 Yii2 等其他框架中,ActiveRecord 不仅是一个 ORM 查询字符串构建器,而且在 CI 中是一个简单的查询构建器。

2- Codeigniter 将自动转义所有传递的参数,但我建议您在运行查询之前验证您的输入。例如,数字 id 字段的值应该是数字,而不是字符串,因此 ID 输入的规则应该是 INTEGER。 您可以在官方文档中查看 Codeigniter 3 中的验证:https://www.codeigniter.com/userguide3/libraries/form_validation.html

您应该做的所有工作是将字段值作为函数参数传递,而不是作为字符串(字段和值一起)。如果要在没有 QueryBuilder 的情况下运行查询,则必须手动转义参数。您可以在 Codeigniter 文档中获得有关它的更多信息:

https://www.codeigniter.com/userguide3/database/queries.html#escaping-queries

【讨论】:

以上是关于codeigniter 查询生成器和活动记录 sql 注入的主要内容,如果未能解决你的问题,请参考以下文章

codeigniter 活动记录获取查询和不带 LIMIT 子句的查询

Codeigniter 活动记录查询

活动记录 CodeIgniter 2 中的这个查询有啥问题?

CodeIgniter 活动记录在子查询中的位置

Codeigniter 活动记录查询的工作方式与自定义查询不同

CONCAT sql 查询需要正确的格式。 Codeigniter 活动记录