【问题标题】:php codeigniter active record classphp codeigniter 活动记录类
【发布时间】:2012-06-14 11:34:34
【问题描述】:

我一直在使用 codeigniter 活动记录类进行数据库访问,但我要保证的一件事是数据库安全性。我的场景是:我正在使用此查询来访问数据库中的数据。

$q = $this->db->query("SELECT* FROM mytable WHERE id = '$p'");

之后我使用return语句。

return $q->result();

当我将数据库加载到我的视图时,我使用 json 编码函数对数组进行编码,而 json 编码函数不仅显示数据库表字段的值,还显示表字段名称。 是否安全,如果不安全,我如何避免显示表字段名称 谢谢。

【问题讨论】:

    标签: php codeigniter


    【解决方案1】:

    这样做

    $q = $this->db->query("SELECT * FROM mytable WHERE id = ?",array('id'=>$p)); 
    

    开始

    如果您担心暴露您的字段名称,请在返回结果之前解析结果并映射到其他内容(下面的示例实际上更适合多行)。

    $ret = array();
    
    foreach($q->result_array() as $row)
    {
      $remapped = array();
    
      $remapped['obscure_name'] = $row['real_name'];
      $ret[]=$remapped;
    }
    
    return $ret;
    

    【讨论】:

    • 我应该怎么做你能参考一些教程。
    【解决方案2】:

    您可以通过将 return 语句更改为:

    return array_values($q->result_array());
    

    更好的方法是解析结果:

    $q = $this->db->query("SELECT* FROM mytable WHERE id = '$p'");
    $result = $q->result();
    
    $values[] = $result['id'];
    $values[] = $result['column1'];
    $values[] = $result['column2'];
    
    return $values;
    

    或在 SQL 语句中指定您需要哪些列以防架构更改:

    SELECT id, column1, column2 FROM mytable WHERE id = '$p'
    

    最后,正如 allen213 所说,您应该使用绑定来防止注入攻击:

    $sql = 'SELECT * FROM mytable WHERE id = ?';
    $q = $this->db->query($sql, array('id' => $p));
    

    【讨论】:

      【解决方案3】:

      我不确定 CI AR 类在后台是如何工作的,但我可以告诉您,您在这里看到的内容似乎非常不安全,因为您将值直接传递到查询中,而不是使用准备好的语句。基本上,如果请求者可以以某种方式操纵该变量的值,那么您就可以进行 SQL 注入攻击(顺便说一句,这是一件非常糟糕的事情)。如果我是你,这就是我会担心的安全问题。

      【讨论】:

      • 实际上我在将值传递给查询之前对其进行了转义。
      • 你用什么逃避它? @allen213 似乎有更好的建议。
      猜你喜欢
      • 1970-01-01
      • 2014-08-15
      • 2014-02-22
      • 1970-01-01
      • 2013-12-08
      • 1970-01-01
      • 2014-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多