Joh*_*ohn 60 sql-injection codeigniter
我刚刚继承了一个项目,因为最后一个开发人员离开了 该项目由Code Igniter构建.我之前从未使用Code Igniter.
我快速浏览一下代码,然后在控制器中看到数据库调用,如下所示:
$dbResult = $this->db->query("SELECT * FROM users WHERE username = '".$_POST['user_name']."'");
Run Code Online (Sandbox Code Playgroud)
或者这样的电话:
$dbResult = $this->db->query("SELECT * FROM users WHERE username = '".$this->input->post('username')."'");
Run Code Online (Sandbox Code Playgroud)
代码点火器是否会自动清理这些查询以防止sql注入?
Mar*_*lde 68
CodeIgniter会在使用该$this->db->query方法时ESCAPE传递的变量.但是,只有当您将变量作为绑定传递时,这是一个示例:
$dbResult = $this->db->query("SELECT * FROM users WHERE username = ?", array($this->input->post('username')));
Run Code Online (Sandbox Code Playgroud)
还要记住,$_POST不应该首选,$this->input->post因为它的作用是检查变量是否存在以防止错误.
Joh*_*man 21
CodeIgniter在其数据库层中提供了一些字符串转义函数.
CI手册摘录:
在将数据提交到数据库之前转义数据是一种非常好的安全做法.CodeIgniter有三种方法可以帮助您执行此操作:
$ this-> db-> escape()此函数确定数据类型,以便它只能转义字符串数据.它还会自动在数据周围添加单引号,因此您不必:
Run Code Online (Sandbox Code Playgroud)$sql = "INSERT INTO table (title) VALUES(".$this->db->escape($title).")";
我会发布另外两个例子,但我不想把阅读手册带走所有的乐趣.
小智 13
不,您发布的代码易受SQL注入攻击.您需要使用查询绑定来构造SQL查询.如果您正在使用CI DB库,则可以使用此类代码编写代码(例如,来自用户指南):
$sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?";
$this->db->query($sql, array(3, 'live', 'Rick'));
Run Code Online (Sandbox Code Playgroud)