40

CodeIgniterで、SQLインジェクションを回避するにはどうすればよいですか?SQLインジェクションを回避するために設定ファイルに設定する方法はありますか?私は値を選択するためにこのコードを使用しています:

$this->db->query("SELECT * FROM tablename WHERE var='$val1'");

値を挿入するためのこれ:

$this->db->query("INSERT INTO  tablename (`var1`,`var2`) VALUES ('$val1','$val2')");

データベースから値を挿入して選択するために使用される別のメソッドは、CodeIgniterinsert()get()メソッドです。CodeIgniterのbulit-in関数を使用しているときにSQLインジェクションを行うチャンスはありますか

4

7 に答える 7

72

CodeIgniterのActiveRecordメソッドは、SQLインジェクションを防ぐために、クエリを自動的にエスケープします。

$this->db->select('*')->from('tablename')->where('var', $val1);
$this->db->get();

また

$this->db->insert('tablename', array('var1'=>$val1, 'var2'=>$val2));

Active Recordsを使用したくない場合は、クエリバインディングを使用してインジェクションを防ぐことができます。

$sql = 'SELECT * FROM tablename WHERE var = ?';
$this->db->query($sql, array($val1));

または、挿入するためにメソッドを使用できますinsert_string()

$sql = $this->db->insert_string('tablename', array('var1'=>$val1, 'var2'=>$val2));
$this->db->query($sql);

escape()独自のクエリを実行する場合の方法もあります。

$val1 = $this->db->escape($val1);
$this->db->query("SELECT * FROM tablename WHERE var=$val1");
于 2011-05-02T13:05:39.297 に答える
8

あなたが使用することができます

$this->db->escape()

方法..

$sql = "INSERT INTO table (title) VALUES(".$this->db->escape($omgomg).")";

他の方法はここにリストされています。

http://codeigniter.com/user_guide/database/queries.html

于 2011-05-02T13:08:21.227 に答える
4

クエリを文字列に直接書き込んでからクエリ関数に渡すことは避けてください。より良いオプションは、クエリを作成して値をエスケープするActiveRecordクラスを使用することです。http://codeigniter.com/user_guide/database/active_record.html

何らかの理由でActiveRecordクラスの使用を避けたい場合は、クエリメソッドに値を渡す前に値をエスケープするためのエスケープメソッドを備えたデータベースクラスのCodeigniterドキュメントを表示できます。http://www.codeignitor.com/user_guide/database/queries.html

ベン

于 2011-05-02T13:14:57.607 に答える
1

クライアント側からの価値を受け入れながら、このコードを使用することをお勧めします。

$client = $this->input->post('client',TRUE);

codeigniterの挿入方法を使用するために挿入する方が良いですが、

$this->db->insert('tablename',$values);

このメソッドを使用する場合、codeingniterはすべてのエスケープを自動的に実行するため、手動でエスケープする必要はありません。

于 2012-09-18T13:29:20.703 に答える
1

CodeIgniterの場合:SQLインジェクションを防ぐための2つのアクションがあります。Webプログラミングの目新しさ、つまりアプリケーションのデータベースの内部を公開する可能性があるために致命的となる可能性のあるWebプログラミングの別の種類のセキュリティホールである人にとって、それはSQLインジェクションです。

そしてありがたいことに、Codeigniterにはそれに対処する機能があります。しかし残念ながら、私が協力したCIプログラマーの多く(そしてあなたでさえ)は、SQLインジェクションの状況を防ぐためにこの2つのアクションを忘れました(または忘れる可能性があります)。

ActiveRecord機能に固執する最初に、次のような完全なクエリを使用してデータのクエリを処理しないでください。

$this->db->query("select * from users where user=$user and password=$password")

故意に間違ったことをするユーザーに関しては、 $userまたは$password変数の内部が正確に何であるかはわかりません。XSSサニタイザーでさえ、引用符、セミコロン、またはダッシュ文字の組み合わせを入力する人には対応しません。したがって、この場合、SQLインジェクションを防ぐための専用の入力サニタイザー機能があるため、このActiveRecordのことを学ぶ必要があります。そして心配しないでください、それはこのような一種の機能連鎖をサポートします:

$this->db->select('title')->from('mytable')->where('id', $id)->limit(10, 20);

$query = $this->db->get();

ただし、次のようにアクティブレコード関数内で通常の(部分的に)クエリ関数を組み合わせても機能しないことを覚えておいてください。

$query = $this->db->where("title LIKE '%$input%'");

これは実際にはこのように変更できます。

$query = $this->db->like("title", $input);

重要なのは、CodeIgniterのActive Recordの可能性を最大限に活用し、それを台無しにしないことです。

しかし、それがうまくいかない場合は、別の方法があります。クエリが非常に長く、わざわざActive Recordのスタイルに変換しない場合は、次の関数を使用して入力を手動でサニタイズできます。

$sanitised_title = $this->db->escape($title);

//LIKEクエリ内で使用します

$sanitised_title = $this->db->escape_like_str($title);

また、クエリ内でサニタイズ/エスケープされた入力を安全に連結できます。

于 2016-01-06T08:11:09.113 に答える
0

varに数字の文字のみが含まれているかどうかを確認できます。つまり、varは定義した形式である必要があります。クエリに挿入する前に

于 2011-05-02T13:05:13.517 に答える
0

CodeIgniterは、これを防ぐための組み込み関数とライブラリを提供します。

$this->db->escape();

この関数は、データを一重引用符で囲み、文字列データのみをエスケープできるようにデータ型を決定します。

于 2021-06-20T05:50:42.363 に答える