我想问一下这两种方法$this->db->escape()
和$this->db->query()
那些可以阻止SQL注入吗?
答案 0 :(得分:2)
默认情况下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);
但是,如果您直接进入query()
$item = $this->input->post('someitem');
$item_esc = $this->db->escape_str($item);
$this->db->query("INSERT INTO `sometable` (`column1`) VALUES ('{$item_esc}')");
答案 1 :(得分:2)
首先,您应该清楚 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以便更好地理解。