2009-10-23 105 views
53

我刚刚继承了一个项目,因为最后一名开发人员离开了。该项目是由Code Igniter构建的。我从来没有使用Code Igniter。CodeIgniter会自动阻止SQL注入吗?

我参加了一个快速浏览一下代码,我看到在控制器数据库调用是这样的:

$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注入?

+0

$这个 - > DB->越狱()将添加“字符串和逃避所有内部引号 – Sanjeev 2015-07-15 09:33:17

+0

检查页roytuts.com/prevent-sql-injection- in-codeigniter/ – user3470953 2016-05-23 09:58:31

回答

63

CodeIgniter在您使用$this->db->query方法时可以跳过您通过的变量。但只有当你通过变量的绑定,这里有一个例子:

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

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

+2

我想应该有第二个参数传递给$ this-> input-> post()函数,它基本上告诉输入是否被消毒。 ($ username ='input' - > post('username',TRUE)));' – thephpx 2011-06-06 06:33:47

+6

这个不再有效。现在,CodeIgniter只要使用其活动记录就可以转义所有内容。 – 2013-02-05 20:02:10

+4

@David天宇Wong事实上,您可以使用Active Record作为*替代*解决方案并不能真正阻止这个答案的有效性。问题中的代码既没有使用解决方案,也没有使用SQL注入。 – IMSoP 2014-03-04 18:07:33

4

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

+2

建立像whatnow? 0_0 – KDawg 2013-11-04 05:24:13

3

根据CI的文档here,框架在控制器构造上过滤POST。它还可以选择通过手动调用函数或设置全局配置来执行XSS过滤。

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

+2

XSS过滤和SQL注入不是同一回事。除非您知道连接到哪个DB(理想情况下,它的当前语言环境),否则无法正确转义SQL,因此它将始终是数据库层的一部分,而不是输入层。 – IMSoP 2014-03-04 18:02:38

13

不,您发布的代码容易受到SQL注入的影响。您需要使用query binding来构建您的SQL查询。如果您使用的CI DB库,你将它的代码是这样的(例如,从用户指南):

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

$this->db->query($sql, array(3, 'live', 'Rick')); 
+4

不再成立。 – 2013-02-05 20:02:36

+3

@David天宇黄请澄清。你是说CI会奇迹般地逃避提供的代码中的输入(尽管没有办法知道它在SQL上下文中使用)?或者只是该查询绑定不再是这个问题的推荐方法? – IMSoP 2014-03-04 18:05:35

+1

man我不知道,一年前我发布了这个,现在我正在使用django。但我承认我应该抱怨为什么,现在已经太晚了。 – 2014-03-05 12:58:41

2

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

20

CodeIgniter在其数据库层提供了几个字符串转义函数。从CI Manual

摘录:

这是一个非常良好的安全习惯提交到你的数据库之前逃脱你的数据。 CI有三种方法,帮助你做到这一点:

  1. $这个 - > DB->越狱()该函数确定数据类型,以便它可以逃脱只有字符串数据。它还会自动将周围的数据单引号所以你没有到:

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

我会发布了两个例子,但我不想把所有的乐趣阅读手册。

+25

+1 for *“但是我不想把所有的乐趣都从阅读手册中拿出来。”* :) - 一种更加甜美的RTFM版本。 – DMin 2011-05-13 07:43:44

+0

Link broken:这是一个合适的替代品吗? http://ellislab.com/codeigniter/user-guide/database/queries.html – Prusprus 2014-01-30 23:59:11

0

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

我从笨手动复制: “超越简单,使用活动记录的一个主要好处是,它允许您创建数据库独立的应用,因为每个数据库适配器生成的查询语法。它还允许更安全的查询,因为系统系统会自动转义这些值。“

而且像有些人已经说了,是这个代码是容易受到SQL注入

2

使用的安全性和更容易编码活动记录:

不是:

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

使用第二个后置参数(TRUE)优化为fil输入电平之三XSS:

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

libraries/input.html

+0

哦,上帝,CI重塑了“魔术引号”?你只能为特定的上下文*逃避某些事情,所以全局的“XSS过滤器”是没有意义的。但是,您的文章还包含一个有效的记录式动态'where()',它可能会*做适当的转义。 – IMSoP 2014-03-04 17:58:49

+0

也许比ol''魔术引号'多一点,'CI_Security'类中的方法'xss_clean'中的细节。 [github](https://github.com/EllisLab/CodeIgniter/blob/develop/system/core/Security.php) – BeKa 2014-03-04 18:23:40

+0

是的,我承认,我有点讽刺。但是,就像魔术引号一样,它会给出错误的信心,让自己拥有一些声称“使输入安全”的东西,就像你在一篇关于SQL注入的文章中提到的那样,它对此绝对没有任何关系(但是魔术引号试图严重)。 – IMSoP 2014-03-04 18:50:55

0

The docs(至少)2.2的状态,在一个红色的大盒子:

虽然活动记录将尽力妥善报价您提供的任何字段和表名称,请注意,它不适用于任意用户输入。不要为其提供未经处理的用户数据。

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

0

使用转义功能CI的注射

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