2012-06-11 215 views
0

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

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

之后我使用return语句。

return $q->result(); 

当我加载数据库到我的视图我编码具有JSON编码功能和JSON编码功能阵列不仅示出了数据库表中的字段的值,而且该表的字段名称。 它是安全的,或者如果不是,我怎样才能避免显示表字段名称 谢谢。

回答

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)); 
0

我不知道的CI AR类的引擎盖下是如何工作的,但我可以告诉你,你有什么在这里,因为你直接传入一个值的查询,而不是使用事先准备好的声明似乎非常不安全的。基本上,如果这个变量的值可以被请求者以某种方式操作,那么你可以有SQL注入攻击(顺便说一句,这是一件非常糟糕的事情)。如果我是你,那就是我的安全问题。

+0

其实我把它传递给查询之前逃离值。 –

+0

你在逃避什么? @ allen213似乎有更好的建议。 –

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; 
+0

我应该如何做到这一点,你可以参考一些教程。 –