如何避免codeigniter中的sql注入

如何避免codeigniter中的sql注入

问题描述:

在CodeIgniter中,我该如何避免sql注入?是否有任何方法来设置配置文件,以避免SQL注入?我使用此代码选择值:如何避免codeigniter中的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的储存卡的函数

+0

页面roytuts.com/prevent-sql-injection-in-codeigniter/ – user3470953 2016-05-23 09:58:49

+0

从安全助手中使用xss_clean方法也很好。 – 2016-12-08 13:24:06

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

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

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

如果你不想使用活动记录,您可以使用query bindings防止对注射。

$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"); 

可以检查你的VAR包含数字的字母,这意味着你VAR线杆是你定义的格式SQL注入。 将其插入查询之前

可以使用

$this->db->escape() 

方法..

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

其他方法在这里列出。

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

你应该尽量避免直接写你的查询到一个字符串,然后将它们传递给查询功能。更好的选择是使用Active Record类,它将为您建立查询并转义值。

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

虽然接受来自客户端的值,最好使用此代码,

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

虽然插入更好地笨插入方法使用,

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

当使用这种方法codeingniter会自动完成所有的转义操作,所以我们不需要手动转义。

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

再次感谢Codeigniter有能力处理它。但不幸的是,我合作的很多CI程序员(甚至是你)都已经(或可能)忘记了这两个行为,以防止SQL注入的任何情况。

棒与ActiveRecord的能力 的第一件事是用完整的查询这样做不是在处理查询数据的任何情况:

$this->db->query("select * from users where user=$user and password=$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的活动记录的可能性的每一点,不要乱它。

但如果是不行的,还存在另一种 如果你有一个很长的查询,也懒得把它转换为活动记录的风格,您可以使用此功能手动消毒你输入:

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

//像查询

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

内使用,你可以放心地串联查询里面的消毒/逃脱输入。