質問

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/queries.html

クエリを直接文字列に書き込み、クエリ関数に渡すことを避けるようにしてください。より良いオプションは、あなたのためにあなたのクエリを構築し、値を逃れるアクティブなレコードクラスを使用することです。 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);

このメソッドを使用すると、コード - コード - すべてがすべてエスケープを行うため、エスケープマニュアルは必要ありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top