【发布时间】:2018-02-02 02:03:38
【问题描述】:
我想问一下$this->db->escape()和$this->db->query()这两种方法
这些可以防止 SQL 注入吗?
【问题讨论】:
标签: php codeigniter security
我想问一下$this->db->escape()和$this->db->query()这两种方法
这些可以防止 SQL 注入吗?
【问题讨论】:
标签: php codeigniter security
首先,你应该清楚db->escape()和db->query()是做什么的。
db->escape()这用于使用 Regular Queries 而不是 Query Builder Class 的用户。当我们使用直接查询 DB 时,存在很高的安全漏洞。所以 CI 从这些攻击中得到了escape()。而there are 3 methods we can use和escape()就是其中之一。
db->query()此方法已添加到 version 1.5.0 中,它仍然存在于 CI 数据库类中,在 v1.5 - V3.0(v4 也是)中进行了主要和次要改进。这用于以简单的方式执行 complex queries 和 SP 并更好地理解。此方法 just run a query whatever inside this query() 并且它没有任何 SQL 注入预防。
escape()可以单独使用吗?没有。为了在 CI 中使用这些 Escaping methods,您必须使用 query()。 escape()、escape_str() 和 escape_like_str() 已添加到 SQL 查询中,显然它们需要 query() 来执行任何类型的操作。
当然可以。他们在那里帮助安全。并阅读 Input Security Filtering post('some_data', TRUE); 和 Security 以更好地理解。
【讨论】:
默认情况下query()没有任何注入预防方法,除非您使用绑定。
$this->db->query("SELECT * FROM sometable WHERE column1 = '?'", array($this->input->post('someitem')));
但是,如果您使用查询构建器:get()、insert() 和 update() 以及任何其他 查询构建器 方法通过一个函数传递传入数据,其中包括, 转义数据。
从表面上看,转义数据是防止 SQL 注入的一部分,另一部分是准备好的查询(传统的 php 是使用 PDO 和准备好的语句完成的)。由于查询构建器为您承担了大部分负载,我不会担心太多。
在 CI 中你可以安全地做:
$item = $this->input->post('someitem');
$this->db->insert('sometable', array('column1' => $item));
插入函数会自动转义$item。
您也可以通过$item = $this->input->post('someitem', TRUE);对帖子进行XSS清理
但是,如果您要直接进入 query()
$item = $this->input->post('someitem');
$item_esc = $this->db->escape_str($item);
$this->db->query("INSERT INTO `sometable` (`column1`) VALUES ('{$item_esc}')");
【讨论】: