我刚刚继承了一个项目,因为最后一位开发人员离开了。该项目由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有三种方法可以帮助您完成此任务:

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

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

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

不,您发布的代码容易受到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');

libraries / input.html

文档(至少)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);?>
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top