如何避免codeigniter中的sql注入
Posted
技术标签:
【中文标题】如何避免codeigniter中的sql注入【英文标题】:how to avoid sql injection in codeigniter 【发布时间】:2011-08-16 23:24:36 【问题描述】:在 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 注入
【问题讨论】:
页面 roytuts.com/prevent-sql-injection-in-codeigniter/ 使用安全助手的 xss_clean 方法也很好。 【参考方案1】: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,可以使用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");
【讨论】:
【参考方案2】:你可以使用
$this->db->escape()
方法..
$sql = "INSERT INTO table (title) VALUES(".$this->db->escape($omgomg).")";
这里列出了其他方法。
http://codeigniter.com/user_guide/database/queries.html
【讨论】:
【参考方案3】:您应该尽量避免将查询直接写入字符串,然后将它们传递给查询函数。更好的选择是使用 Active Record 类,它将为您构建查询并转义值。 http://codeigniter.com/user_guide/database/active_record.html
如果您出于某种原因想要避免使用 Active Record 类,那么您可以查看数据库类的 Codeigniter 文档,该文档具有用于在将值传递给查询方法之前转义值的转义方法。 http://www.codeignitor.com/user_guide/database/queries.html
本
【讨论】:
【参考方案4】:在接受来自客户端的价值时,最好使用此代码,
$client = $this->input->post('client',TRUE);
虽然插入更好用codeigniter的插入方式,
$this->db->insert('tablename',$values);
当使用该方法时,codeingniter 会自动进行所有转义,因此我们无需手动转义。
【讨论】:
【参考方案5】:在 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);
您可以安全地在查询中连接已清理/转义的输入。
【讨论】:
【参考方案6】:您可以检查您的 var 是否仅包含数字字母,这意味着您的 var 是否采用您定义的格式。 在将其插入查询之前
【讨论】:
【参考方案7】:CodeIgniter 提供了内置函数和库来防止这种情况:
$this->db->escape();
此函数自动在数据周围添加单引号并确定数据类型,使其只能转义字符串数据。
【讨论】:
您好 w.Daya,此信息已在 2011 年的另一个答案中发布。发布新答案时,请尽量避免重复之前发布的信息。以上是关于如何避免codeigniter中的sql注入的主要内容,如果未能解决你的问题,请参考以下文章