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);
また、クエリ内でサニタイズ/エスケープされた入力を安全に連結できます。