CodeIgniter会自动阻止SQL注入吗?

我只是inheritance了一个项目,因为最后一个开发者离开了。 该项目是由Code Igniter构build的。 我以前从来没有使用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注入?

CodeIgniter使用$this->db->query方法时,可以使您传递的variables成为可能。 但是,只有当你通过variables作为绑定,这里是一个例子:

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

还要记住, $_POST不应该比$this->input->post因为它所做的是检查variables是否存在以防止错误。

代码点火器在其数据库层提供了几个string转义函数。

摘自CI手册:

http://ellislab.com/codeigniter/user-guide/database/queries.html

在将数据提交到数据库之前,将数据转义出来是非常好的安全措施。 CodeIgniter有三个方法可以帮助你做到这一点:

  1. $ this-> db-> escape()该函数确定数据types,以便它只能转义string数据。 它也会自动为数据添加单引号,所以你不必:$ sql =“INSERT INTO table(title)VALUES(”。$ this-> db-> escape($ title)。“)”;

我会张贴其他两个例子,但我不想从阅读手册中获得所有的乐趣。

不,您发布的代码容易受到SQL注入的影响。 您需要使用查询绑定来构build您的SQL查询。 如果您使用的是CI数据库,您可以像这样编写代码(用户指南中的示例):

 $sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?"; $this->db->query($sql, array(3, 'live', 'Rick')); 

不,CodeIgniter不会神奇地清理已经build成这样的查询。

根据CI的文档,框架在控制器结构上过滤POST。 它也可以select通过手动调用函数或设置全局configuration来进行XSS过滤。

我从来没有使用过CI,只是为了玩它,所以我不知道我有多信任这个。

这不能逃脱任何东西。 您最好将其更改为绑定语法或活动logging语法

您应该使用$ this-> input-> post,查询绑定和活动logging具有更安全的数据,然后仍然可以testingtestingtesting。

使用有效的logging安全和简单的编码:

而不是:

  $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'); 

这可能是一个痛苦,但你应该把你的查询转换为活动logging。

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

就像有些人已经说过的,是的,这个代码容易受到SQL注入的影响

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

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

库/ input.html

文档 (至less)2.2状态,在一个大红色的框中:

虽然Active Record会尽量正确地引用您提供的任何字段和表名称,但请注意,它不适用于任意用户input。 不要给它提供unsanitized用户数据。

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

使用转义函数来注入CI

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