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有三个方法可以帮助你做到这一点:
- $ 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);?>