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エラー報告レベル

環境が異なれば、必要なエラー報告のレベルも異なります。デフォルトでは、開発ではエラーが表示されますが、テストとライブではエラーが非表示になります。というファイルがありますindex.phpこの目的で使用されるCodeIgniterのルートディレクトリにあります。に引数としてゼロを渡すとerror_reporting() 関数を実行すると、すべてのエラーが非表示になります。

データベースエラー

PHPエラーをオフにしても、MySQLエラーは開いたままです。これをオフにすることができますapplication/config/database.php。をセットするdb_debug のオプション $db 配列から FALSE 以下に示すように。

$db['default']['db_debug'] = FALSE;

エラーログ

もう1つの方法は、エラーをログファイルに転送することです。そのため、サイトのユーザーには表示されません。単に、log_threshold の値 $config 1インチまでの配列 application/cofig/config.php 以下に示すようにファイルします。

$config['log_threshold'] = 1;

CSRF防止

CSRFは、クロスサイトリクエストフォージェリの略です。で有効にすることで、この攻撃を防ぐことができますapplication/config/config.php 以下に示すようにファイルします。

$config['csrf_protection'] = TRUE;

を使用してフォームを作成する場合 form_open()関数の場合、CSRFを非表示フィールドとして自動的に挿入します。を使用してCSRFを手動で追加することもできますget_csrf_token_name() そして get_csrf_hash()関数。ザ・get_csrf_token_name() 関数はCSRFの名前を返し、 get_csrf_hash() CSRFのハッシュ値を返します。

CSRFトークンは、送信するたびに再生成できます。また、CSRFCookieの有効期間を通じて同じ状態に保つこともできます。値を設定することによりTRUE、キー付きの構成配列内 ‘csrf_regenerate’ 以下に示すようにトークンを再生成します。

$config['csrf_regenerate'] = TRUE;

キーを使用して構成配列にURLを設定することにより、CSRF保護からURLをホワイトリストに登録することもできます。 ‘csrf_exclude_uris’以下に示すように。正規表現を使用することもできます。

$config['csrf_exclude_uris'] = array('api/person/add');

パスワード処理

多くの開発者は、Webアプリケーションでパスワードを処理する方法を知りません。そのため、多くのハッカーは、システムに侵入するのが非常に簡単だと感じています。パスワードを取り扱う際は、以下の点にご注意ください。

  • パスワードをプレーンテキスト形式で保存しないでください。

  • 常にパスワードをハッシュしてください。

  • パスワードの保存にBase64または同様のエンコーディングを使用しないでください。

  • MD5やSHA1のような弱いまたは壊れたハッシュアルゴリズムを使用しないでください。PHP独自のパスワードハッシュ関数で使用されるBCryptのような強力なパスワードハッシュアルゴリズムのみを使用してください。

  • パスワードをプレーンテキスト形式で表示または送信しないでください。

  • ユーザーのパスワードに不必要な制限を加えないでください。