CodeIgniter会自动阻止SQL注入吗?

时间:2009-10-23 20:47:19

标签: codeigniter sql-injection

我刚刚继承了一个项目,因为最后一位开发人员离开了。该项目由Code Igniter构建。我之前从未使用Code Igniter。

我快速查看了代码,我在控制器中看到了这样的数据库调用:

$dbResult = $this->db->query("SELECT * FROM users WHERE username = '".$_POST['user_name']."'");

或这样的电话:

$dbResult = $this->db->query("SELECT * FROM users WHERE username = '".$this->input->post('username')."'");

代码点火器会自动清理这些查询以防止sql注入吗?

12 个答案:

答案 0 :(得分:68)

使用$this->db->query方法时,CodeIgniter会对您传递的变量进行ESCAPE。但是,只有当您将变量作为绑定传递时,这是一个示例:

$dbResult = $this->db->query("SELECT * FROM users WHERE username = '?'", array($this->input->post('username')));

另请注意,$_POST不应优先于$this->input->post,因为它的作用是检查变量是否存在以防止出错。

答案 1 :(得分:21)

CodeIgniter在其数据库层中提供了一些字符串转义函数。

摘自CI Manual

  

在将数据提交到数据库之前转义数据是一种非常好的安全做法。 CodeIgniter有三种方法可以帮助您完成此任务:

     
      
  1. $ this-> db-> escape()此函数确定数据类型,以便它只能转义字符串数据。它还会自动在数据周围添加单引号,因此您不必:

    $sql = "INSERT INTO table (title) VALUES(".$this->db->escape($title).")";
    
  2.   

我会发布另外两个例子,但我不想从阅读手册中获得所有乐趣。

答案 2 :(得分:13)

不,您发布的代码容易受到SQL注入的影响。您需要使用query binding来构建SQL查询。如果您正在使用CI DB库,则可以使用此类代码编写代码(例如,来自用户指南):

$sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?";

$this->db->query($sql, array(3, 'live', 'Rick')); 

答案 3 :(得分:3)

不,CodeIgniter不会神奇地清理像这样构建的查询。

答案 4 :(得分:3)

根据CI的文档here,框架在控制器构造上过滤POST。它还可以选择通过手动调用函数或设置全局配置来进行XSS过滤。

我从来没有使用CI,只是为了玩它,所以我不确定我相信这有多远。

答案 5 :(得分:2)

这不会逃避任何事情。最好将其更改为绑定语法或active record syntax

答案 6 :(得分:2)

您应该使用$ this-> input-> post,查询绑定和活动记录来获得更安全的数据,然后仍然可以测试测试测试。

答案 7 :(得分:2)

使用有效记录以确保安全和更轻松的编码:

而不是:

  $dbResult = $this->db->query("SELECT * FROM users WHERE username'".$_POST['user_name']."'");

使用(相同的结果):

$this->db->where('username',$this->input->post('user_name');
$dbResult = $this->db->get('users');

答案 8 :(得分:0)

这可能会很痛苦,但您应该将查询转换为有效记录。

我正在从CodeIgniter手册中复制: “除了简单性之外,使用 Active Record 功能的一个主要好处是,它允许您创建独立于数据库的应用程序,因为查询语法是由每个数据库适配器生成的。它还允许更安全查询,因为系统会自动转义值。“

就像有些人已经说过的那样,这段代码很容易被SQL注入

答案 9 :(得分:0)

使用第二个后置参数(TRUE)进行优化,以在输入级别上过滤XSS:

$this->db->where('username',$this->input->post('user_name', TRUE);
$dbResult = $this->db->get('users');

libraries/input.html

答案 10 :(得分:0)

The docs(至少)2.2状态,在一个大红框中:

  

虽然Active Record会尽力正确引用您提供的任何字段和表名,但请注意,它不适用于任意用户输入。请勿使用未经过处理的用户数据提供。

对于这个程序员来说意味着“不要依赖Active Record引用任何”。

答案 11 :(得分:0)

使用转义函数注入CI

<?php $username = $this->input->post('username');
$query = 'SELECT * FROM subscribers_tbl WHERE user_name = '.$this->db->escape($email);
$this->db->query($query);?>