0

私はデータベースアクセスにcodeigniterアクティブレコードクラスを使用していますが、保証したいことの1つはデータベースのセキュリティです。私のシナリオは次のとおりです。このクエリを使用してデータベースのデータにアクセスしています。

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

この後、returnステートメントを使用します。

return $q->result();

データベースをビューにロードすると、json encode関数を使用して配列をエンコードします。jsonencode関数は、データベーステーブルフィールドの値だけでなく、テーブルフィールド名も表示します。安全ですか、そうでない場合は、テーブルフィールド名の表示を回避するにはどうすればよいですか?

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 に答える