web-dev-qa-db-ja.com

codeigniterでSQLインジェクションを回避する方法

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

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

そしてこれは値を挿入するためのものです:

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

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

31
user667030

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

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

または

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

Active Recordsを使用したくない場合は、インジェクションを防ぐために query bindings を使用できます。

_$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");
_
59
Rocket Hazmat

使用できます

$this->db->escape()

方法..

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

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

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

6
Vamsi Krishna B

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

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

ベン

3
Ben

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インジェクションを防ぐための専用の入力サニタイザー機能があるため、このActive Recordのことを学ぶ必要があります。心配しないでください。次のような関数チェーンをサポートしています。

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

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

1
user5751226

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

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

Codeigniter挿入メソッドを使用する方がより適切に挿入しながら、

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

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

0
shihabudheen

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

0
Mark T