在 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);
并且您可以安全地连接查询中经过清理/转义的输入。