我一直在使用codeigniter活动记录类进行数据库访问,但我要保证的一件事是数据库安全性。我的方案是:我使用此查询来访问数据库中的数据。
$q = $this->db->query("SELECT* FROM mytable WHERE id = '$p'");
在此之后我使用return语句。
return $q->result();
当我将数据库加载到我的视图时,我使用json编码函数对数组进行编码,而json encode函数不仅显示数据库表字段的值,还显示表字段名称。 是安全还是不安全如何避免显示表字段名称 感谢。
答案 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注入攻击(顺便说一下,这是一件非常糟糕的事情)。如果我是你,这就是我所担心的安全问题。