サーチ…


前書き

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]キーワードで置き換えます。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow