40

在 CodeIgniter 中,如何避免 sql 注入?是否有任何方法可以在配置文件中设置以避免 sql 注入?我正在使用此代码来选择值:

$this->db->query("SELECT * FROM tablename WHERE var='$val1'");

这用于插入值:

$this->db->query("INSERT INTO  tablename (`var1`,`var2`) VALUES ('$val1','$val2')");

用于从数据库中插入和选择值的另一种方法是 CodeIgniter 的insert()get()方法。使用 CodeIgniter 的内置函数时是否有机会进行 sql 注入

4

7 回答 7

72

CodeIgniter 的Active Record方法会自动为您转义查询,以防止 sql 注入。

$this->db->select('*')->from('tablename')->where('var', $val1);
$this->db->get();

或者

$this->db->insert('tablename', array('var1'=>$val1, 'var2'=>$val2));

如果您不想使用 Active Records,可以使用查询绑定来防止注入。

$sql = 'SELECT * FROM tablename WHERE var = ?';
$this->db->query($sql, array($val1));

或者对于插入,您可以使用该insert_string()方法。

$sql = $this->db->insert_string('tablename', array('var1'=>$val1, 'var2'=>$val2));
$this->db->query($sql);

escape()如果您更喜欢运行自己的查询,也可以使用该方法。

$val1 = $this->db->escape($val1);
$this->db->query("SELECT * FROM tablename WHERE var=$val1");
于 2011-05-02T13:05:39.297 回答
8

您可以使用

$this->db->escape()

方法..

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

此处列出了其他方法。

http://codeigniter.com/user_guide/database/queries.html

于 2011-05-02T13:08:21.227 回答
4

您应该尽量避免将查询直接写入字符串,然后将它们传递给查询函数。更好的选择是使用 Active Record 类,它将为您构建查询并转义值。http://codeigniter.com/user_guide/database/active_record.html

如果您出于某种原因想要避免使用 Active Record 类,那么您可以查看数据库类的 Codeigniter 文档,该文档具有用于在将值传递给查询方法之前转义值的转义方法。http://www.codeignitor.com/user_guide/database/queries.html

于 2011-05-02T13:14:57.607 回答
1

在接受来自客户端的价值时,最好使用此代码,

$client = $this->input->post('client',TRUE);

在插入更好的同时使用codeigniter插入方法,

$this->db->insert('tablename',$values);

使用此方法时,codeingniter 会自动进行所有转义,因此我们无需手动转义。

于 2012-09-18T13:29:20.703 回答
1

在 CodeIgniter 中:有 2 个动作可以防止 SQL 注入。对于那些对 Web 编程很陌生的人来说,Web 编程中的另一种安全漏洞可能是致命的,因为它可以暴露应用程序数据库的内部,它是 SQL 注入。

再次庆幸的是,Codeigniter 有能力处理它。但不幸的是,与我合作的许多 CI 程序员(甚至是你)确实(或可能)忘记了这两个操作以防止任何 SQL 注入的情况。

坚持使用 ActiveRecord 功能第一件事是在任何情况下都不要使用这样的完整查询来处理查询数据:

$this->db->query("select * from users where user=$user and password=$password")

当涉及到故意做错事的用户时,您不知道$user 或 $password变量中的确切内容。即使是 XSS sanitiser 也不会处理在其中输入引号、分号或破折号字符组合的人。所以在这种情况下,你需要学习这个 Active Record 东西,因为它具有专门用于防止 SQL 注入的输入清理功能。别担心,它支持这样的函数链:

$this->db->select('title')->from('mytable')->where('id', $id)->limit(10, 20);

$query = $this->db->get();

但是请记住,如果您仍然像这样在活动记录函数中组合通常的(部分)查询函数,它将不起作用:

$query = $this->db->where("title LIKE '%$input%'");

实际上可以像这样改变。

$query = $this->db->like("title", $input);

关键是,使用 CodeIgniter 的 Active Record 的所有可能性,不要乱用它。

但是如果这不起作用,还有一个替代方法如果您有一个很长的查询并且不费心将其转换为 Active Record 的样式,您可以使用此功能手动清理您的输入:

$sanitised_title = $this->db->escape($title);

// 在 LIKE 查询中使用

$sanitised_title = $this->db->escape_like_str($title);

并且您可以安全地连接查询中经过清理/转义的输入。

于 2016-01-06T08:11:09.113 回答
0

您可以检查您的 var 是否仅包含数字字母,这意味着您的 var 是否采用您定义的格式。在将其插入查询之前

于 2011-05-02T13:05:13.517 回答
0

CodeIgniter 提供了内置函数和库来防止这种情况:

$this->db->escape();

此函数自动在数据周围添加单引号并确定数据类型,以便它只能转义字符串数据。

于 2021-06-20T05:50:42.363 回答