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)
现在您的查询相对安全了。
我正在开发一个 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)
现在您的查询相对安全了。