4

$this-db->query() 是否有 mysql 注入保护?我想知道,因为我在实例中使用它并且没有做任何事情来防止 sql 注入。

4

3 回答 3

5

不,db->query() 默认情况下不受 SQL 注入保护,您几乎没有选择。使用查询绑定

$sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?"; 
$this->db->query($sql, array(3, 'live', 'Rick'));

对于更复杂的查询,您必须在继续时构建查询,请使用 compile_bind() 获取 SQL 块。

$sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?"; 
$safe_sql  = $this->db->compile_bind($sql, array(3, 'live', 'Rick'));

等等

或者在参数上使用 escape $this->db->e​​scape()

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

最好的做法是首先使用表单验证,并将 xss_clear、max_length 等内容与上述任何一种方式结合使用。

于 2012-10-13T21:30:35.897 回答
5

使用 CodeIgniter 进行查询的 ActiveRecord 样式会转义参数,但不会转义 query()。

您可以通过这种方式使用活动记录:

$someAge = 25;
$this->db->select('names, age');
$query = $this->db->get_where('people', array('age' => '>' . $someAge));

在此处阅读更多信息:https ://www.codeigniter.com/userguide2/database/active_record.html

于 2012-10-13T20:51:59.760 回答
0

您可以使用查询绑定

CI 3 用户指南中的示例:

$sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?";
$this->db->query($sql, array(3, 'live', 'Rick'));
于 2020-08-25T02:12:18.353 回答