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

Amr*_*Amr 7 php activerecord codeigniter

如果我使用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
Run Code Online (Sandbox Code Playgroud)

此代码将生成以下查询字符串:

SELECT * FROM (`my_table`) WHERE `first_name` = 'John' AND `age` < 30 AND `status` = 'active'
Run Code Online (Sandbox Code Playgroud)

现在如果我分配了一个字符串$where而不是数组,就像这样:

$where = "first_name = 'John' AND age < 30 AND status = 'active'";
Run Code Online (Sandbox Code Playgroud)

然后它将生成以下查询字符串:

SELECT * FROM (`my_table`) WHERE `first_name` = 'John' AND age < 30 AND status = 'active'
Run Code Online (Sandbox Code Playgroud)

请注意,在分配字符串时$where,codeigniter backticks (``)仅在第一个字段的名称周围添加,这first_name在我们的例子中.另一方面,当我们分配数组时,codeigniter在所有字段名称周围添加了反引号$where

我的问题:这是codeigniter中的错误还是这是正常的?如果我使用以下代码来防止codeigniter在字段名称周围添加反引号:

$this->db->where($where, null, false);
Run Code Online (Sandbox Code Playgroud)

这将产生以下查询字符串:

SELECT * FROM (`my_table`) WHERE first_name = 'John' AND age < 30 AND status = 'active'
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*ave 1

问:这是 codeigniter 中的错误还是正常现象?

  • 是的,这是一个错误,但不是一个严重的错误。

问:编写 $this->db->where($where, null, false) 是否有任何风险或缺点?

该代码本身没有风险。如果您在 WHERE 子句中进行硬编码,那么可能永远不会出现问题。唯一会出现问题的是当您捕获用户输入(例如表单或 URL)时,您必须手动清理这些输入

清理你的 where 子句非常重要。

错误示例:容易受到 SQL 注入攻击

$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);
Run Code Online (Sandbox Code Playgroud)

更好示例:不易受到伤害

$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);
Run Code Online (Sandbox Code Playgroud)

到目前为止你所做的一切都没有错,它只会给你带来更多清理你的 where 子句的负担,因为使用 $this->db->where($where, null, false) 将删除内置的清理。

简而言之:如果您的 where 子句提供了用户输入,那么使用此方法会使您最初更容易受到 SQL 注入的攻击。但没有什么是你不能通过一些卫生功能快速收紧的。

我知道这个答案很完美,但希望它有帮助。