codeigniter
Webアプリケーションのセキュリティ保護
サーチ…
前書き
CodeIgniterは開発フレームワークです。あなたがアプリケーションを安全にするように努力していません。それは単にあなた自身でそれを行うためのツールを提供するだけです。 CIのセキュリティページでは、開発者がアプリケーションセキュリティを理解し、アプリケーションに組み込むことを期待しています。
WebAppのセキュリティが比較的新しい場合、私はOWASPから始めます。 ZendやCakeのような他のフレームワークを見てみることは有益かもしれません。
構文
- $ freshdata = $ this-> security-> xss_clean($ user_input_data);
パラメーター
ユーザー入力の配列 | ブランク |
---|---|
xss_filter($array of user input) | ブランク |
XSSの予防
XSSはクロスサイトスクリプティングを意味します。 CodeIgniterにはXSSフィルタリングセキュリティが付属しています。このフィルタは、悪意のあるJavaScriptコードや、Cookieを乗っ取って悪意のある行為を行おうとするコードを防ぎます。 XSSフィルタでデータをフィルタリングするには、次のようにxss_clean()メソッドを使用します。
$data = $this->security->xss_clean($data);
この機能は、データを送信するときにのみ使用してください。オプションの2番目のブール値パラメータは、XSS攻撃のイメージファイルをチェックするためにも使用できます。これはファイルアップロード機能に便利です。その値がtrueの場合、画像は安全であり、それ以外の場合は意味しません。
SQLインジェクション防止
SQLインジェクションは、データベースクエリーに対する攻撃です。 PHPでは、 mysql_real_escape_string()関数を使用してこれを他の手法と一緒に使用するのを防ぎますが、CodeIgniterはこれを防ぐために組み込みの関数とライブラリを提供します。
CodeIgniterのSQLインジェクションを防ぐには、次の3つの方法があります。
- クエリのエスケープ
- クエリのバインディング
- アクティブレコードクラス
クエリのエスケープ
<?php
$username = $this->input->post('username');
$query = 'SELECT * FROM subscribers_tbl WHERE user_name = '.
$this->db->escape($email);
$this->db->query($query);
?>
$this->db->escape()
関数は、データの周りに一重引用符を自動的に追加し、文字列データだけをエスケープできるようにデータ型を決定します。
クエリのバインディング
<?php
$sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?";
$this->db->query($sql, array(3, 'live', 'Rick'));
?>
上記の例では、疑問符(?)はquery()
関数の2番目のパラメータの配列に置き換えられます。このようにクエリを構築する主な利点は、安全なクエリを生成する値が自動的にエスケープされることです。 CodeIgniterエンジンは自動的にそれを行いますので、覚えておく必要はありません。
アクティブレコードクラス
<?php
$this->db->get_where('subscribers_tbl',array('status'=> active','email' => '[email protected]'));
?>
アクティブなレコードを使用すると、各データベースアダプタによってクエリ構文が生成されます。また、値が自動的にエスケープされるため、より安全な照会も可能です。
PHPエラーを隠す
運用環境では、ユーザーにエラーメッセージを表示したくないことがよくあります。デバッグの目的で開発環境で有効になっていると良いです。これらのエラーメッセージには、セキュリティ上の理由からサイトのユーザーに表示すべきではない情報が含まれている場合があります。
エラーに関連する3つのCodeIgniterファイルがあります。 PHPエラー報告レベル
異なる環境では、さまざまなレベルのエラー報告が必要です。デフォルトでは開発にエラーが表示されますが、テストやライブではエラーは表示されません。 CodeIgniterのルートディレクトリにindex.phpというファイルがあります。これはこの目的で使用されています。 error_reporting()関数に引数としてゼロを渡すと、すべてのエラーが隠されます。
CSRF予防
CSRFは、クロスサイトリクエスト偽造の略です。以下のように、application / config / config.phpファイルのオプションを有効にすることで、この攻撃を防ぐことができます。
$config['csrf_protection'] = TRUE;
form_open()
関数を使用してフォームを作成すると、隠しフィールドにCSRFトークンが自動的に挿入されます。また、 get_csrf_token_name()
およびget_csrf_hash()
関数を使用して、CSRFトークンを手動で追加することもできます。その名前が示すget_csrf_token_name()
、 get_csrf_token_name()
関数はCSRFトークンの名前を返し、 get_csrf_hash()
はハッシュを返します。
CSRFトークンは、毎回提出のために再生成することができます。また、CSRFクッキーの存続期間中、CSRFトークンを同じに保つこともできます。設定オプション 'csrf_regenerate'を設定すると、以下に示すようにトークンの再生成が強制されます。
$config['csrf_regenerate'] = TRUE;
以下に示すように、キー 'csrf_exclude_uris'を使用して、構成配列内で一致を設定することによって、URLをCSRF保護からホワイトリストすることができます。正規表現を使用することもできます。
$config['csrf_exclude_uris'] = array('api/person/add');
ユーザー入力から不正行為データを削除する
// XSS Filtering
$data = array(
'name'=> '<script>Abuse Data</script>'
);
$data = $this->security->xss_clean($data); // Clean Data
// Escaping Queries
<?php $username = $this->input->post('username'); $query = 'SELECT * FROM subscribers_tbl WHERE user_name = '. $this->db->escape($email); $this->db->query($query); ?>
ユーザー入力に対するXSSの防止
ユーザーの入力を信頼しないでください。 <script>
タグまたは任意のjavascript alert();
ようなすべてのユーザー入力alert();
私たちはこれを防ぐ必要がありますすべてのデータは私たちのブラウザで実行されません。 xss防止法を使用して、安全なデータをハッカーの手に渡るように制限しなければなりません。また、ユーザーの入力検証とプログラマチックエラーを解決する開発者の責任もあります。
これはCodeIgniterのxss防止の例であることを確認してください。
$data = array(
'name' => "<script>alert('abc')</script>",
'email' => "[email protected]"
);
var_dump($data);
// Print array without xss cleaning/xss filtering
array(2) { ["name"]=> string(29) "" ["email"]=> string(19) "[email protected]" } // Result with alert
// now print data after xss filtering
$data = $this->security->xss_clean($data);
var_dump($data);
//Print array without xss cleaning/xss filtering
array(2) { ["name"]=> string(38) "[removed]alert('abc')[removed]" ["email"]=> string(19) "[email protected]" } // Result Without alert
ですから、xss_filteringを追加した後、私たちはユーザーが入力した濫用コードを実行することに問題はありません。 CodeIgniterはこの乱用タグを[removed]
キーワードで置き換えます。