web-dev-qa-db-ja.com

CodeIgniterはSQLインジェクションを自動的に防ぎますか?

最後の開発者が去ったため、私はプロジェクトを継承しました。このプロジェクトはCode Igniterで構築されています。これまでにCode Igniterを使用したことはありません。

コードをざっと見てみると、コントローラーに次のようなデータベース呼び出しがあります。

$dbResult = $this->db->query("SELECT * FROM users WHERE username = '".$_POST['user_name']."'");

またはこのような呼び出し:

$dbResult = $this->db->query("SELECT * FROM users WHERE username = '".$this->input->post('username')."'");

コードイグナイターは、SQLインジェクションを防ぐためにこれらのクエリを自動的にサニタイズしますか?

60
John

CodeIgniterは、$this->db->queryメソッドを使用するときに渡す変数をエスケープします。ただし、変数をバインドとして渡す場合のみ、例を示します。

$dbResult = $this->db->query("SELECT * FROM users WHERE username = '?'", array($this->input->post('username')));

また、$_POST$this->input->postよりも優先されるべきではないことに注意してください。エラーを防ぐために変数が存在するかどうかをチェックするからです。

68
MarioRicalde

CodeIgniterは、データベース層にいくつかの文字列エスケープ関数を提供します。

CI Manual からの抜粋:

データをデータベースに送信する前にエスケープすることは、非常に優れたセキュリティ対策です。 CodeIgniterには、これを行うのに役立つ3つのメソッドがあります。

  1. $ this-> db-> escape()この関数は、文字列データのみをエスケープできるようにデータ型を決定します。また、データを一重引用符で自動的に追加するため、次の操作は必要ありません。

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

私は他の2つの例を投稿しますが、マニュアルを読むことからすべての楽しみを奪いたくありません。

21
John Himmelman

いいえ、投稿したコードはSQLインジェクションの影響を受けやすくなっています。 クエリバインディング を使用して、SQLクエリを作成する必要があります。 CI DBライブラリを使用している場合、次のようにコーディングします(ユーザーガイドの例)。

$sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?";

$this->db->query($sql, array(3, 'live', 'Rick')); 
13
Funkatron

いいえ、CodeIgniterはこのように作成されたクエリを魔法のようにサニタイズしません。

3
Ben James

CIのドキュメント ここ によると、フレームワークはコントローラー構築時にPOSTをフィルターします。また、オプションで関数を手動で呼び出すか、グローバル構成を設定することでXSSフィルターを行います。

私はCIを使ったことがありますが、それを試すためだけに使用しているので、どれだけ信頼できるかわかりません。

3
Josh Lindsey

安全性とコーディングを容易にするためにアクティブレコードを使用します。

のではなく:

  $dbResult = $this->db->query("SELECT * FROM users WHERE username'".$_POST['user_name']."'");

使用(同じ結果):

$this->db->where('username',$this->input->post('user_name');
$dbResult = $this->db->get('users');
2
Rid Iculous

より安全なデータを取得するには、$ this-> input-> post、クエリバインディング、およびアクティブレコードを使用してから、テストtest testを確認してください。

2
stef

それは何も逃れません。バインド構文または アクティブレコード構文 に変更することをお勧めします

2
Thorpe Obazee

CIの注入へのエスケープ機能の使用

<?php $username = $this->input->post('username');
$query = 'SELECT * FROM subscribers_tbl WHERE user_name = '.$this->db->escape($email);
$this->db->query($query);?>
0
Akbor

ドキュメント (少なくとも)2.2状態、大きな赤いボックス内:

Active Recordは、入力したフィールド名とテーブル名を適切に引用するように最善を尽くしますが、任意のユーザー入力で動作するように設計されていないことに注意してください。サニタイズされていないユーザーデータを入力しないでください。

このプログラマにとって、「anythingを引用するためにActive Recordに依存しない」という意味です。

0
Madbreaks

苦痛かもしれませんが、クエリをアクティブレコードに変換する必要があります。

CodeIgniterマニュアルからコピーしています:「単純さを超えて、Active Record機能を使用する主な利点は、各データベースアダプタによってクエリ構文が生成されるため、データベースに依存しないアプリケーションを作成できることです。 値はシステムによって自動的にエスケープされるため、より安全なクエリも可能になります

そして、一部の人々がすでに言ったように、はい、このコードはSQLインジェクションの影響を受けやすい

0
VangelisB

2番目の投稿パラメーター(TRUE)で最適化され、入力レベルでXSSをフィルターします。

$this->db->where('username',$this->input->post('user_name', TRUE);
$dbResult = $this->db->get('users');

libraries/input.html

0
BeKa