このエントリーをはてなブックマークに追加

更新日: 2016年2月25日

実行時間: 0.0366

CI_Security

 Webアプリケーションを構築する際には、セキュリティを考慮し安全なシステムを開発する必要があります。
 CodeIgniterの「CI_Security」クラスでは、動的なWebサイトを攻撃する手法「XSS」及び、「CSRF」に対する防御機能を提供しています。

 しかしながら、CodeIgniterでは、デフォルトでこれらの機能は無効となっています。
(最低限の入力データに対するセキュリティ機能はCI_Inputクラスに備わっています。)

デフォルトでXSS対策有効化

 GET・POST・COOKIEは常に「XSS」攻撃のデータで汚染されている可能性があることを心配する必要があります。
 もし、GET・POST・COOKIEのデータが最終的に出力データとして利用される可能性がある場合、且つ、 都度フィルタリングするよりデフォルトでフィルタリングする方が効率的な場合は、 自動で全てのGET・POST・COOKIEデータにフィルタリングを行う設定を行います。
 設定は「application/config/config.php」の 「$config['global_xss_filtering']を「TRUE」にすることで有効になります。

  • application/config/config.php
  • $config['global_xss_filtering'] = TRUE;

 しかしながら、XSSフィルタリングの処理にはそれなりのリソースを費やすため、できるだけ個別に
フィルタリングする設計を心がける必要があるかもしれません。
 個別にXSSフィルタリングを行う方法は、「CI_Input」クラスの頁で説明します。

CSRF対策有効化

 GETやPOSTでクライアントから送られてくるデータが、 エンドユーザが意図して送信されたものかチェックする必要があります。
 この対策を有効にするには「application/config/config.php」 の「 $config['csrf_protection'] 」設定を「TRUE」にします。  更に、HTMLの「<form>」タグ内にCSRF対策の 「<input type="hidden">」タグを入れる必要があります。

  • application/config/config.php
  • $config['csrf_protection'] = TRUE;
  • application/views/my_form.php
  • <html>
        <?php $this->load->helper('form'); ?>
        <?php echo form_open('my_class/my_form'); ?>
            <input type="submit">
        </form>
    </html>
                            

    CSRF対策を有効にすると、 フォームヘルパー(form_helper.php)の「form_open()」関数により 自動で「<input type="hidden">」タグが差し込まれます。

CI_Securityの提供する機能

 CI_Securityクラスタ芸協する機能について説明します。

get_csrf_token_name()
get_csrf_hash()

 「get_csrf_token_name()」メソッドは、「application/config/config.php」 で設定した「$config['csrf_token_name']」の値を取得します。
 出力するHTMLの「<form>」タグの「<input type="hidden">」タグの 「name=""」属性として利用します。  「get_csrf_hash()」メソッドは、「<input type="hidden">」タグの 「value=""」属性にセットする文字列を取得します。

    $data['csrf_token'] = $this->security->get_csrf_token_name();
    $data['csrf_hash'] = $this->security->get_csrf_hash();
    $this->load->view('my_form', $data);
  • application/views/my_form.php
  • <input type="hidden" name="<?php echo $csrf_token;?>" value="<?php echo $csrf_hash;?>">

xss_clean($str, $is_image = FALSE) 一番上に戻る

 第一引数のデータ(文字列または配列)をXSSフィルタリングを行い除染します。 画像データの場合は、第2引数に「TRUE」を指定します。

    $str = $this->security->xss_clean($str);
    CI_Input」クラスの 「post()」「get()」「get_post()」、「cookie()」メソッドでXSSフィルタリングを有効にした場合は、 CI_Inputクラス内で「xss_clean()」が実行されます。
     ユーザがこのメソッドを直接利用する必要はあまりないでしょう。

entity_decode($str, $charset='UTF-8') 一番上に戻る

 HTMLエンティティ文字列を通常の文字列に戻します。第二引数は返還後の文字コードを指定します。
 このメソッドはPHPの「html_entity_decode()」関数の代替えメソッドで、html_entity_decode()のバグを補っています。

    $kome = $this->security->entity_decode('&#8251;');
    echo $kome;
    //=> ※

sanitize_filename($str, $relative_path = FALSE) 一番上に戻る

 クライアントから送信されたデータをシステムのファイル名として処理する場合、 「ディレクトリトラバーサル」などの攻撃対策としてファイル名データをサニタイズ(除染)する必要があります。
 第二引数に「TRUE」を指定すると、文字列から「./」及び「/」を取り除きません。 つまりサブディレクトリへの相対パスは許可されることになります。

    $filename = $this->security->sanitize_filename($filename);