Codeigniter-security
CodeIgniter-セキュリティ
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はこれを防ぐための組み込み関数とライブラリを提供します。
次の3つの方法でCodeIgniterでSQLインジェクションを防ぐことができます-
- クエリのエスケープ
- クエリバイディング *アクティブレコードクラス
クエリのエスケープ
<?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()*関数の引数としてゼロを渡すと、すべてのエラーが隠されます。
データベースエラー
PHPエラーをオフにした場合でも、MySQLエラーは開いたままです。 application/config/database.php でこれをオフにすることができます。 以下に示すように、 $ db 配列の db_debug オプションを FALSE に設定します。
$db['default']['db_debug'] = FALSE;
エラーログ
別の方法は、エラーをログファイルに転送することです。 そのため、サイトのユーザーには表示されません。 以下に示すように、 application/cofig/config.php ファイルで $ config 配列の log_threshold 値を1に設定するだけです。
$config['log_threshold'] = 1;
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()*関数はCSRFの名前を返し、 get_csrf_hash()*はCSRFのハッシュ値を返します。
CSRFトークンは、サブミットするたびに再生成できます。また、CSRF Cookieの有効期間全体を通して同じ状態に保つこともできます。 値 TRUE を設定することにより、キー ‘csrf_regenerate’ を持つ構成配列で、以下に示すようにトークンを再生成します。
$config['csrf_regenerate'] = TRUE;
以下に示すように、キー ‘csrf_exclude_uris’ を使用してconfig配列に設定することにより、CSRF保護からURLをホワイトリストに登録することもできます。 正規表現を使用することもできます。
$config['csrf_exclude_uris'] = array('api/person/add');
パスワード処理
多くの開発者は、Webアプリケーションでパスワードを処理する方法を知らないため、多くのハッカーがシステムへの侵入が非常に簡単であると考えています。 パスワードを処理する際には、次の点に留意する必要があります-
- パスワードをプレーンテキスト形式で保存しないでください。
- 常にパスワードをハッシュします。
- パスワードの保存にBase64などのエンコードを使用しないでください。
- MD5やSHA1などの弱いまたは壊れたハッシュアルゴリズムを使用しないでください。 PHPのパスワードハッシュ関数で使用されるBCryptなどの強力なパスワードハッシュアルゴリズムのみを使用してください。
- パスワードをプレーンテキスト形式で表示したり送信したりしないでください。
- ユーザーのパスワードに不必要な制限をかけないでください。