CodeIgniter会自动阻止SQL注入吗?

Joh*_*ohn 60 sql-injection codeigniter

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

我快速浏览一下代码,然后在控制器中看到数据库调用,如下所示:

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

或者这样的电话:

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

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

Mar*_*lde 68

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

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

还要记住,$_POST不应该首选,$this->input->post因为它的作用是检查变量是否存在以防止错误.

  • 这不再有效.现在只要你使用他们的activerecords,CodeIgniter就会逃脱一切. (7认同)
  • @David天宇Wong事实上,您可以使用Active Record作为*替代*解决方案并不能真正阻止此答案生效.问题中的代码既不使用解决方案,也适用于SQL注入. (6认同)
  • 我认为应该有一个第二个参数传递给$ this-> input-> post()函数,它基本上告诉输入是否要被清理.`$ dbResult = $ this-> db-> query("SELECT*FROM users WHERE username ='?'",array($ this-> input-> post('username',TRUE)));` (2认同)

Joh*_*man 21

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

CI手册摘录:

在将数据提交到数据库之前转义数据是一种非常好的安全做法.CodeIgniter有三种方法可以帮助您执行此操作:

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

    $sql = "INSERT INTO table (title) VALUES(".$this->db->escape($title).")";
    
    Run Code Online (Sandbox Code Playgroud)

我会发布另外两个例子,但我不想把阅读手册带走所有的乐趣.

  • +1 for*"但我不想从阅读手册中获得所有乐趣."*:) - 更甜蜜的RTFM版本.. (27认同)

小智 13

不,您发布的代码易受SQL注入攻击.您需要使用查询绑定来构造SQL查询.如果您正在使用CI DB库,则可以使用此类代码编写代码(例如,来自用户指南):

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

$this->db->query($sql, array(3, 'live', 'Rick')); 
Run Code Online (Sandbox Code Playgroud)

  • @David天宇Wong请澄清.你是说CI会神奇地逃避提供的代码中的输入(尽管没有任何方法可以知道它在SQL上下文中使用)?或者只是该查询绑定不再是这个问题的推荐方法? (3认同)
  • 男人我不知道,一年前我发布了这个,我现在正在使用django.但我承认我应该改变原因,现在为时已晚. (2认同)