【问题标题】:Does codeigniter $this->db->query() or $this->db->escape() prevent SQL Injection?codeigniter $this->db->query() 或 $this->db->e​​scape() 是否会阻止 SQL 注入?
【发布时间】:2018-02-02 02:03:38
【问题描述】:

我想问一下$this->db->escape()$this->db->query()这两种方法

这些可以防止 SQL 注入吗?

【问题讨论】:

标签: php codeigniter security


【解决方案1】:

首先,你应该清楚db->escape()db->query()是做什么的。


db->escape()

这用于使用 Regular Queries 而不是 Query Builder Class 的用户。当我们使用直接查询 DB 时,存在很高的安全漏洞。所以 CI 从这些攻击中得到了escape()。而there are 3 methods we can useescape()就是其中之一

db->query()

此方法已添加到 version 1.5.0 中,它仍然存在于 CI 数据库类中,在 v1.5 - V3.0(v4 也是)中进行了主要和次要改进。这用于以简单的方式执行 complex queriesSP 并更好地理解。此方法 just run a query whatever inside this query() 并且它没有任何 SQL 注入预防


escape()可以单独使用吗?

没有。为了在 CI 中使用这些 Escaping methods,您必须使用 query()escape()escape_str()escape_like_str() 已添加到 SQL 查询中,显然它们需要 query() 来执行任何类型的操作。


这些可以防止 SQL 注入吗?

当然可以。他们在那里帮助安全。并阅读 Input Security Filtering post('some_data', TRUE);Security 以更好地理解。

【讨论】:

    【解决方案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);对帖子进行XSS清理

    但是,如果您要直接进入 query()

    ,则您应该避开您的获取/帖子
    $item = $this->input->post('someitem');
    
    $item_esc = $this->db->escape_str($item);
    
    $this->db->query("INSERT INTO `sometable` (`column1`) VALUES ('{$item_esc}')");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-29
      • 2017-04-10
      • 2011-12-15
      • 1970-01-01
      • 2013-05-31
      • 2023-03-27
      • 1970-01-01
      相关资源
      最近更新 更多