这是Codeigniter活动记录中的错误吗?

时间:2013-12-30 11:30:44

标签: php codeigniter activerecord

如果我使用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中的错误还是这是正常的?如果我使用以下代码来防止codeigniter在字段名称周围添加反引号:

$this->db->where($where, null, false);

将产生以下查询字符串:

SELECT * FROM (`my_table`) WHERE first_name = 'John' AND age < 30 AND status = 'active'

以这种方式撰写where部分有任何风险或缺点吗?

4 个答案:

答案 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)

在codeigniter活动记录中,您必须按一个引号定义列名(如果您的字符串是双引号)。清楚地看到这个功能。请参阅系统文件夹中的where代码。