CodeigniterでのSQLインジェクションを回避する方法
-
27-10-2019 - |
質問
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の穴を開ける機能を使用している間、SQLインジェクションの機会はありますか
解決
Codeigniter's アクティブレコード メソッドは、SQL注入を防ぐために、自動的にクエリを逃がします。
$this->db->select('*')->from('tablename')->where('var', $val1);
$this->db->get();
また
$this->db->insert('tablename', array('var1'=>$val1, 'var2'=>$val2));
アクティブレコードを使用したくない場合は、使用できます クエリバインディング 注射を防ぐため。
$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");
他のヒント
使用できます
$this->db->escape()
方法..
$sql = "INSERT INTO table (title) VALUES(".$this->db->escape($omgomg).")";
他の方法はここにリストされています。
クエリを直接文字列に書き込み、クエリ関数に渡すことを避けるようにしてください。より良いオプションは、あなたのためにあなたのクエリを構築し、値を逃れるアクティブなレコードクラスを使用することです。 http://codeigniter.com/user_guide/database/active_record.html
何らかの理由でアクティブなレコードクラスの使用を避けたい場合は、データベースクラスのCodeigniterドキュメントを表示できます。このクラスは、クエリメソッドに渡す前に値を逃がすためのエスケープメソッドを備えています。 http://www.codeignitor.com/user_guide/database/queries.html
ベン
Codeigniterでは、SQL注入を防ぐための2つのアクションがあります。 Webプログラミングでノベルティである人にとって、アプリケーションのデータベースの内側を暴露できるために致命的である可能性のあるWebプログラミングの別の種類のセキュリティホールは、SQLインジェクションです。
ありがたいことに、Codeigniterにはそれに対処する能力があります。しかし、残念ながら、CIプログラマの多くは、SQL注射の状況を防ぐために、この2つのアクションを忘れてしまった(またはあなたでさえ)しました(またはあなたでさえ)。
ActiverCordの機能に固執する最初のことは、このような完全なクエリを使用して、データのクエリを処理する状況ではないことです。
$this->db->query("select * from users where user=$user and password=$password")
あなたは何が正確に何を中に持っているのかわかりません $ユーザーまたは$パスワード 故意に間違ったことをするユーザーに関しては変数。 XSS Sanitiserでさえ、引用、セミコロン、またはダッシュキャラクターの組み合わせを入力する人には対処しません。したがって、この場合、SQL注入を防ぐための入力サニシタイザー機能があるため、このアクティブな記録のことを学ぶ必要があります。心配しないでください、それはこのような関数チェーンの種類をサポートしています:
$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のスタイルに変換することを気にしないでください。この関数を使用して入力を手動で消毒することができます。
$sanitised_title = $this->db->escape($title);
// Queryのように内部で使用します
$sanitised_title = $this->db->escape_like_str($title);
また、クエリ内のサニタイズ/エスケープ入力を安全に連結することができます。
varに数字の文字のみが含まれているかどうかを確認できます。つまり、var mastは定義された形式にあります。クエリに挿入する前に
クライアント側から価値を受け入れながら、このコードを使用する方が良い、
$client = $this->input->post('client',TRUE);
CodeIgniter挿入方法を使用する方が適切に挿入されますが、
$this->db->insert('tablename',$values);
このメソッドを使用すると、コード - コード - すべてがすべてエスケープを行うため、エスケープマニュアルは必要ありません。