我正在从事一个CodeIgniter 2项目,该项目无法升级到v.3。到目前为止,我在使用查询构建器时遇到了困境,尤其是当我需要进行更复杂的查询时。CI V.3通过使用 -> group_start()和 -> group_end()可以很好地处理它,但是CI V.2没有它。现在,我的困境是以下内容:仅在查询的地方使用自定义是安全的吗?
$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
注意:传递给此函数的所有值均自动逃脱, 产生更安全的查询。
我认为,如果您正确使用它,而不是像您的想法那样直接插入VAR。
所以我会这样(如果使用CI:/)
$this->db->where('name', $name);
$this->db->where("(status='boss' OR status='active')", NULL, FALSE);
..丑陋
正确的查询实现将为
$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);
我使用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);
}
,然后选择类似...
// $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();
查询构建器只能直接逃脱传递给它的数据而不是通过字符串中的分配。
如果您想安全,只需在输入变量之前逃脱变量:
$var1 = $this->db->escape_str($data)
现在对您的查询相对安全。
此处的文档。