php codeigniter活动记录类

时间:2012-06-11 14:35:52

标签: php codeigniter

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

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

在此之后我使用return语句。

return $q->result();

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

3 个答案:

答案 0 :(得分: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));

答案 1 :(得分: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 :(得分:0)

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