Function 如何避免codeigniter中的sql注入

Function 如何避免codeigniter中的sql注入,function,codeigniter,sql-injection,built-in,data-security,Function,Codeigniter,Sql Injection,Built In,Data Security,在CodeIgniter中,如何避免sql注入?是否有任何方法可以在配置文件中设置以避免sql注入?我使用此代码选择值: $this->db->query("SELECT * FROM tablename WHERE var='$val1'"); $this->db->query("INSERT INTO tablename (`var1`,`var2`) VALUES ('$val1','$val2')"); 这用于插入值: $this->db->qu

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

$this->db->query("SELECT * FROM tablename WHERE var='$val1'");
$this->db->query("INSERT INTO  tablename (`var1`,`var2`) VALUES ('$val1','$val2')");
这用于插入值:

$this->db->query("SELECT * FROM tablename WHERE var='$val1'");
$this->db->query("INSERT INTO  tablename (`var1`,`var2`) VALUES ('$val1','$val2')");

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

您可以检查var是否只包含数字字母,这意味着您必须使用您定义的格式。 在将其插入查询之前,CodeIgniter的方法会自动为您转义查询,以防止sql注入

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

如果不想使用活动记录,可以使用来防止注入

$this->db->select('*')->from('tablename')->where('var', $val1);
$this->db->get();
$sql = 'SELECT * FROM tablename WHERE var = ?';
$this->db->query($sql, array($val1));
或者,对于插入,您可以使用该方法

如果您希望运行自己的查询,也可以使用此方法

$val1 = $this->db->escape($val1);
$this->db->query("SELECT * FROM tablename WHERE var=$val1");
你可以用

$this->db->escape()
方法

$sql = "INSERT INTO table (title) VALUES(".$this->db->escape($omgomg).")";
这里列出了其他方法


应尽量避免将查询直接写入字符串,然后将其传递给查询函数。更好的选择是使用活动记录类,它将为您构建查询并转义值

如果您希望避免出于任何原因使用Active Record类,那么您可以查看数据库类的Codeigniter文档,该数据库类在将值传递给查询方法之前具有用于转义值的转义方法


Ben

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

$client = $this->input->post('client',TRUE);
插入时最好使用codeigniter插入法

$this->db->insert('tablename',$values);
使用此方法时,CodeInniter会自动执行所有逃生,因此我们无需执行逃生手册。

在CodeInniter中: 有两个操作可防止SQL注入。 对于那些在web编程方面比较新颖的人来说,web编程中的另一种安全漏洞可能是致命的,因为它会暴露应用程序数据库的内部,这就是SQL注入

谢天谢地,Codeigniter有能力处理这个问题。但不幸的是,我合作的许多CI程序员(甚至你)确实(或可能)忘记了这两个动作,以防止SQL注入的任何情况

$this->db->select('*')->from('tablename')->where('var', $val1);
$this->db->get();
$sql = 'SELECT * FROM tablename WHERE var = ?';
$this->db->query($sql, array($val1));
坚持使用ActiveRecord功能 第一件事是,在任何情况下都不要使用以下完整查询来处理数据查询:

$this->db->query("select * from users where user=$user and password=$password")
$this->db->select('title')->from('mytable')->where('id', $id)->limit(10, 20);

$query = $this->db->get();
$query = $this->db->where("title LIKE '%$input%'");
对于故意做错事的用户,您不知道$user或$password变量中到底包含什么。即使XSS sanitiser也不会处理在其中输入引号、分号或破折号组合的人。 所以在本例中,您需要了解这个活动记录,因为它具有专门用于防止SQL注入的输入消除器功能。别担心,它支持这样的函数链接:

$this->db->query("select * from users where user=$user and password=$password")
$this->db->select('title')->from('mytable')->where('id', $id)->limit(10, 20);

$query = $this->db->get();
$query = $this->db->where("title LIKE '%$input%'");
但请记住,如果您仍然在active record函数中组合常用(部分)查询函数,则它将不起作用,如下所示:

$this->db->query("select * from users where user=$user and password=$password")
$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);

您可以在查询中安全地连接经过消毒/转义的输入。

page roytuts.com/prevent-sql-injection-in-codeigniter/security helper提供的xss_clean方法也很好。