Safety/vulnerability 使用 Codeigniter 查询生成器自定义 where 字符串

Safety/vulnerability of using Codeigniter query builder custom where string

我正在开发一个 Codeigniter 2 项目,该项目无法升级到 v.3。到目前为止,我 运行 在使用查询构建器时陷入困境,尤其是当我需要进行更复杂的查询时。 CI v.3 通过使用 ->group_start() 和 ->group_end() 很好地处理了它,但是 CI v.2 没有。 现在,我的困境如下:仅使用自定义 where 查询是否安全?

$this->db->where("name='$name' AND status='boss' OR status='active'");

查询生成器是否对其进行了足够的清理,或者我应该采用额外的清理(第三个参数保留为默认值 - true)?

** 更新 **

我没有准确地写出我需要这个的复杂查询。沿着这个逻辑的某个地方:

A=1 && B=2 && C=3 && (D=10 || E=20 || F=30)

根据文档,https://codeigniter.com/userguide2/database/active_record.html#select

Note: All values passed to this function are escaped automatically, producing safer queries.

我假设你使用得当,而不是像你想的那样直接插入变量。

所以我会这样做(如果我使用 CI :/)

$this->db->where('name', $name);
$this->db->where("(status='boss' OR status='active')", NULL, FALSE);

..丑

我使用 CI 但跳过他们的查询生成器并使用 PDO。您仍然可以将所有设置放在 /config/database.php 中并直接使用它们。

 class SomeModel_model extends CI_Model {

   protected $pdo;

   public function __construct() {
   parent::__construct();

   $this->load->database();

   $opt = array(
   PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
   PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
   );

   $this->pdo = new PDO($this->db->dsn, $this->db->username, $this->db->password, $opt);

   }

然后 select 比如...

  // $this->db->where("name='$name' AND status='boss' OR status='active'");

  $sql = "SELECT * from myTable where name = :name and (status = 'boss' OR status = 'active')';

  $stmt = $this->pdo->prepare($sql);

  $stmt->execute(['name' => $name]);

  $results = $stmt->fetch();

您的查询的正确实现应该是

$this->db
    ->where('name',$name)
    ->group_start()
        ->where('status','boss')
        ->or_where('status','active')
    ->group_end();

编辑 Codeigniter 2

$this->db
    ->where('name',$name)
    ->where('(status','boss')
    ->or_where('status',$this->db->escape('active').')',false);

查询构建器只转义直接传递给它的数据,而不是通过字符串中的赋值。

如果你想安全起见,只需在输入变量之前转义变量,如下所示:

$var1 = $this->db->escape_str($data)

现在您的查询相对安全了。

Documentation of this here.