CodeIgniterはSQLインジェクションを自動的に防ぎますか?
-
06-07-2019 - |
質問
最後の開発者が去ったため、プロジェクトを継承しました。このプロジェクトはCode Igniterで構築されています。これまでにCode Igniterを使用したことはありません。
コードをざっと見てみると、次のようなコントローラーのデータベース呼び出しが表示されています。
$dbResult = $this->db->query("SELECT * FROM users WHERE username = '".最後の開発者が去ったため、プロジェクトを継承しました。このプロジェクトはCode Igniterで構築されています。これまでにCode Igniterを使用したことはありません。
コードをざっと見てみると、次のようなコントローラーのデータベース呼び出しが表示されています。
$dbResult = $this->db->query("SELECT * FROM users WHERE username = '".$this->input->post('username')."'");
または次のような呼び出し:
<*>
コードイグナイターは、SQLインジェクションを防ぐためにこれらのクエリを自動的にサニタイズしますか?
POST['user_name']."'");
または次のような呼び出し:
<*>コードイグナイターは、SQLインジェクションを防ぐためにこれらのクエリを自動的にサニタイズしますか?
解決
CodeIgniterは、 $ this-&gt; db-&gt; query
メソッドを使用するときに渡す変数をエスケープします。ただし、変数をバインドとして渡す場合のみ、例を示します。
$dbResult = $this->db->query("SELECT * FROM users WHERE username = '?'", array($this->input->post('username')));
また、 $ _ POST
は $ this-&gt; input-&gt; post
よりも優先されるべきではないことを忘れないでください。エラー。
他のヒント
CodeIgniterは、データベース層でいくつかの文字列エスケープ関数を提供します。
CIマニュアルからの抜粋:
データをデータベースに送信する前にデータをエスケープすることは、非常に優れたセキュリティ対策です。 CodeIgniterには、これを行うのに役立つ3つのメソッドがあります:
$ this-&gt; db-&gt; escape()この関数は、文字列データのみをエスケープできるようにデータ型を決定します。また、データを一重引用符で自動的に追加するため、次の操作は必要ありません。
$sql = "INSERT INTO table (title) VALUES(".$this->db->escape($title).")";
他の2つの例を投稿しますが、マニュアルを読むことからすべての楽しみを取りたくありません。
いいえ、投稿したコードはSQLインジェクションの影響を受けやすくなっています。 SQLクエリを作成するには、クエリバインディングを使用する必要があります。 CI DBライブラリを使用している場合、次のようにコーディングします(ユーザーガイドの例):
$sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?";
$this->db->query($sql, array(3, 'live', 'Rick'));
いいえ、CodeIgniterはこのように作成されたクエリを魔法のようにサニタイズしません。
CIのドキュメントこちらによれば、フレームワークはコントローラー構築時にPOSTをフィルタリングします。また、オプションで、関数を手動で呼び出すか、グローバル構成を設定することにより、XSSフィルタリングを実行します。
CIを使用したことがないのは、単にCIを使用するだけであるため、どれだけ信頼できるかわからないからです。
それは何もエスケープしません。バインド構文またはアクティブレコード構文
より安全なデータを取得するには、$ this-&gt; input-&gt; post、クエリバインディング、およびアクティブレコードを使用してから、テストtest testを確認してください。
安全性とコーディングを容易にするためにアクティブレコードを使用する:
ではなく:
$dbResult = $this->db->query("SELECT * FROM users WHERE username'".安全性とコーディングを容易にするためにアクティブレコードを使用する:
ではなく:
$this->db->where('username',$this->input->post('user_name');
$dbResult = $this->db->get('users');
使用(同じ結果):
<*>POST['user_name']."'");
使用(同じ結果):
<*>面倒かもしれませんが、クエリをアクティブレコードに変換する必要があります。
CodeIgniterマニュアルからコピーしています: &quot;単純さを超えて、アクティブレコード機能を使用する主な利点は、クエリ構文が各データベースアダプタによって生成されるため、データベースに依存しないアプリケーションを作成できることです。 システムによって値が自動的にエスケープされるため、より安全なクエリも可能になります。&quot;
そして、一部の人々がすでに言ったように、はい、このコードはSQLインジェクションの影響を受けやすいです
2番目のpostパラメーター(TRUE)で最適化され、入力レベルでXSSをフィルター処理します:
$this->db->where('username',$this->input->post('user_name', TRUE);
$dbResult = $this->db->get('users');
(少なくとも)2.2状態のドキュメント、大きな赤いボックス:
Active Recordは、入力したフィールド名とテーブル名を適切に引用するよう最善を尽くしますが、任意のユーザー入力で動作するように設計されていないことに注意してください。サニタイズされていないユーザーデータを入力しないでください。
このプログラマにとっては、「何か&quot;を引用するためにアクティブレコードに依存しない」という意味です。
CIの注入にエスケープ関数を使用
<?php $username = $this->input->post('username');
$query = 'SELECT * FROM subscribers_tbl WHERE user_name = '.$this->db->escape($email);
$this->db->query($query);?>