CodeIgniter会自动阻止SQL注入吗?
-
06-07-2019 - |
题
我刚刚继承了一个项目,因为最后一位开发人员离开了。该项目由Code Igniter构建。我之前从未使用Code Igniter。
我快速查看了代码,我在控制器中看到了这样的数据库调用:
$dbResult = $this->db->query("SELECT * FROM users WHERE username = '".我刚刚继承了一个项目,因为最后一位开发人员离开了。该项目由Code Igniter构建。我之前从未使用Code Igniter。
我快速查看了代码,我在控制器中看到了这样的数据库调用:
$dbResult = $this->db->query("SELECT * FROM users WHERE username = '".$this->input->post('username')."'");
或这样的电话:
<*>
代码点火器会自动清理这些查询以防止sql注入吗?
POST['user_name']."'");
或这样的电话:
<*>代码点火器会自动清理这些查询以防止sql注入吗?
解决方案
CodeIgniter在使用 $ this-&gt; db-&gt; query
方法时,使用ESCAPE传递的变量。但是,只有当您将变量作为绑定传递时,这是一个示例:
$dbResult = $this->db->query("SELECT * FROM users WHERE username = '?'", array($this->input->post('username')));
还要记住 $ _ POST
不应优先于 $ this-&gt; input-&gt; post
,因为它的作用是检查变量是否存在以防止错误。
其他提示
CodeIgniter在其数据库层中提供了一些字符串转义函数。
摘自 CI手册:
在将数据提交到数据库之前转义数据是一种非常好的安全做法。 CodeIgniter有三种方法可以帮助您完成此任务:
- 醇>
$ this-&gt; db-&gt; escape()此函数确定数据类型,以便它只能转义字符串数据。它还会自动在数据周围添加单引号,因此您不必:
$sql = "INSERT INTO table (title) VALUES(".$this->db->escape($title).")";
我会发布另外两个例子,但我不想从阅读手册中获得所有乐趣。
不,您发布的代码容易受到SQL注入的影响。您需要使用查询绑定来构建SQL查询。如果您正在使用CI DB库,则可以使用此类代码编写代码(例如,来自用户指南):
$sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?";
$this->db->query($sql, array(3, 'live', 'Rick'));
不,CodeIgniter不会神奇地清理像这样构建的查询。
根据CI的文档此处,该框架会过滤控制器构建上的POST。它还可以选择通过手动调用函数或设置全局配置来进行XSS过滤。
我从来没有使用CI,只是为了玩它,所以我不确定我相信这有多远。
这不会逃避任何事情。最好将其更改为绑定语法或活动记录语法
您应该使用$ this-&gt; input-&gt; post,查询绑定和活动记录来获得更安全的数据,然后仍然可以测试测试测试。
使用有效记录以确保安全和更轻松的编码:
而不是:
$dbResult = $this->db->query("SELECT * FROM users WHERE username'".使用有效记录以确保安全和更轻松的编码:
而不是:
$this->db->where('username',$this->input->post('user_name');
$dbResult = $this->db->get('users');
使用(相同的结果):
<*>POST['user_name']."'");
使用(相同的结果):
<*>这可能会很痛苦,但您应该将查询转换为有效记录。
我正在从CodeIgniter手册中复制: “除了简单性之外,使用 Active Record 功能的一个主要好处是它允许您创建独立于数据库的应用程序,因为查询语法是由每个数据库适配器生成的。 它还允许更安全的查询,因为系统会自动转义值。“
就像有些人已经说过的那样,这段代码很容易被SQL注入
使用第二个后置参数(TRUE)进行优化,以在输入级别上过滤XSS:
$this->db->where('username',$this->input->post('user_name', TRUE);
$dbResult = $this->db->get('users');
文档(至少)2.2状态,在大红盒子:
虽然Active Record会尽力正确引用您提供的任何字段和表名,但请注意,它不适用于任意用户输入。请勿使用未经过处理的用户数据提供。
这个程序员意味着“不要依赖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);?>