如果我使用codeigniter活动记录从db表中获取数据,如下所示:
$where = array("first_name" => "John", "age <" => 30, "status" => "active");
$this->db->where($where);
$query = $this->db->get("my_table");
die(var_dump($this->db->last_query())); // displays the query string
此代码将生成以下查询字符串:
SELECT * FROM (`my_table`) WHERE `first_name` = 'John' AND `age` < 30 AND `status` = 'active'
现在,如果我将一个字符串分配给$where
而不是数组,就像这样:
$where = "first_name = 'John' AND age < 30 AND status = 'active'";
然后它将生成以下查询字符串:
SELECT * FROM (`my_table`) WHERE `first_name` = 'John' AND age < 30 AND status = 'active'
请注意,在将字符串分配给$where
时,codeigniter仅在第一个字段的名称周围添加backticks (``)
,在我们的案例中为first_name
。另一方面,当我们将数组分配给$where
我的问题:这是codeigniter中的错误还是这是正常的?如果我使用以下代码来防止codeigniter在字段名称周围添加反引号:
$this->db->where($where, null, false);
将产生以下查询字符串:
SELECT * FROM (`my_table`) WHERE first_name = 'John' AND age < 30 AND status = 'active'
以这种方式撰写where
部分有任何风险或缺点吗?
答案 0 :(得分:1)
问:这是codeigniter中的错误还是正常的?
问:写这个有什么风险或缺点吗?&gt; db-&gt; where($ where,null,false)?
此代码本身并不存在风险。如果您在WHERE子句中进行硬编码,则可能永远不会出现问题。问题出现的唯一时间是您捕获用户输入,例如表单或URL,这将是您必须手动清理的问题
清理where子句非常重要。
BAD示例:Vunerable to SQL Injection
$fname = $_POST['fname'];
$age = $_POST['age'];
$status = $_POST['status'];
$where = sprintf("first_name = '%s' AND age < %d AND status = '%s'",$fname,$age,$status);
$this->db->where($where, null, false);
更好的例子:不那么可怜
$fname = (string) mysql_real_escape_string($_POST['fname']);
$age = (int) $_POST['age'];
$status = (string) mysql_real_escape_string($_POST['status']);
$where = sprintf("first_name = '%s' AND age < %d AND status = '%s'",$fname,$age,$status);
$this->db->where($where, null, false);
到目前为止,你所做的一切都没有错,它只会增加你在那里使用$ this-&gt; db-&gt; where($ where,null,false)将删除你的where子句的负担。建在卫生设施中。
简而言之::如果where子句将提供用户输入,则使用此方法会使您最初对SQL注入更加容易受到攻击。但是,通过一些卫生功能,你无法迅速收紧任何事情。
我知道这个答案很完美,但希望它有所帮助。
答案 1 :(得分:0)
$this->db->where($where, null, false);
这是冒险的方式,因为CodeIgniter不会尝试使用反引号来保护您的字段或表名。
对于缺少的反引号,似乎有些错误,因为一些Stack溢出用户在使用group_concat选项生成时也会在查询中提到问题。这是其中一个例子。
Weird backticks behaviour in Active Record in Code Igniter 2.0.3
答案 2 :(得分:0)
不,至少在这种情况下,这应该不是问题。反引号允许字段名称中的替代字符。由于年龄和状态都不包含可能导致问题的任何字符,因此反引号是不必要的。此外,反引号的使用取决于使用的SQL服务器。
请参阅此问题以供参考:Using backticks around field names
答案 3 :(得分:0)
where
代码。