0

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

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

在此之后,我使用 return 语句。

return $q->result();

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

4

3 回答 3

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));
于 2012-06-11T14:59:11.137 回答
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;
于 2012-06-11T14:44:48.180 回答
0

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

于 2012-06-11T14:41:17.143 回答