1

既存のイントラネット システムを CodeIgniter に変換する予定です。あらゆる種類の異なる文字を処理できるように、私は常に UTF-8 を使用してきました。これは、システム (請求書、住所ラベルなどの出力) にとって不可欠です。

システムのユーザーを混乱させることが多いため、入力時に自動的に置き換えることにした文字がいくつかあります。

  • 一重引用符と二重引用符の両方の中括弧。通常のアポストロフィ/引用符に置き換え
  • 通常のハイフンに置き換えられたエン ダッシュとエム ダッシュ
  • 3 つのピリオドに置き換えられた楕円

少なくともこれらの句読記号はすべて一貫して使用され、保存されています。

データベースに格納されるデータは、このシステムでは常に POST によって受信されるため、ページが読み込まれるたびに POST 配列に対して次の関数を実行します...

function nasty_chars_replace(&$var) {

    $trans_table = array(
        chr(0xe2).chr(0x80).chr(0x9a) => '\'', //SINGLE LOW-9 QUOTATION MARK
        chr(0xe2).chr(0x80).chr(0x9e) => '"', //DOUBLE LOW-9 QUOTATION MARK
        chr(0xe2).chr(0x80).chr(0xa6) => '...', //HORIZONTAL ELLIPSIS
        chr(0xe2).chr(0x80).chr(0x98) => '\'', //LEFT SINGLE QUOTATION MARK
        chr(0xe2).chr(0x80).chr(0x99) => '\'', //RIGHT SINGLE QUOTATION MARK
        chr(0xe2).chr(0x80).chr(0x9c) => '"', //LEFT DOUBLE QUOTATION MARK
        chr(0xe2).chr(0x80).chr(0x9d) => '"', //RIGHT DOUBLE QUOTATION MARK
        chr(0xe2).chr(0x80).chr(0x93) => '-', //EN DASH
        chr(0xe2).chr(0x80).chr(0x94) => '-' //EM DASH
    );

    foreach ($trans_table as $utf8_code => $replace) {
        $var = str_replace($utf8_code, $replace, $var);
    }

    return trim($var);
}
array_walk_recursive($_POST, 'nasty_chars_replace');

CodeIgniter で、すべての POST データ (POST が存在する場合) に対してグローバルに同様のことを行う方法はありますか?

他の誰かがこのようなことをしますか?
データの一貫性のために「クレンジング」(サニタイズなどではない)を検討する必要がある、混乱しやすい他の文字はありますか?
編集:これも良い考えですか?

EDIT 2:trim()先頭/末尾の空白を削除するために、すべての POST データも同様に削除する必要があります。そのため、誰かが入力を空白で埋めることを決定した場合、検証は失敗する可能性があります。

4

2 に答える 2

1

あなたの質問の一部に答えるために-CIの入力クラスを使用すると、セキュリティフィルタリングが行われます...新しいコントローラーが呼び出されると、セキュリティフィルタリング機能が自動的に呼び出されます。

したがって、$_POST の代わりに$this->input->post()を使用すると....

GET/POST/COOKIE 配列キーをフィルタリングし、英数字 (およびその他のいくつかの文字) のみを許可します。

Input クラスには、クロスサイト スクリプティング攻撃を防ぐために入力を自動的にフィルター処理する機能があります。POST または COOKIE データに遭遇するたびにフィルタを自動的に実行したい場合は、application/config/config.php ファイルを開いて次のように設定することで有効にできます。

$config['global_xss_filtering'] = TRUE;

または、2 番目のパラメーターとして TRUE を使用して必要な場合のみ。

$this->input->post(NULL, TRUE); // returns all POST items with XSS filter 

したがって、コアの Input クラスを拡張できると思います

class MY_Input extends CI_Input {

    function __construct()
    {
        parent::__construct();
    }
}

ここにカスタム関数を追加して、特定の文字を置き換えて値をトリミングします。次に、この Input クラスは、セキュリティとデータベースの一貫性のためにグローバル入力データを前処理します。

それが役に立てば幸い

于 2012-09-19T14:58:17.817 に答える
0

毎回関数を呼び出す必要なく、すべての POST データに対してこれを実行したい場合は、コントローラーのコンストラクターに配置するか、コントローラーの親のコンストラクターに配置することを検討してください。

コントローラーのコンストラクター:

class Home extends CI_Controller{
    function __construct(){
        parent::__construct();
        if(!empty($_POST)) array_walk_recursive($_POST, 'nasty_chars_replace');
    }

    function index(){
        //typically a GET request, nasty_chars_replace will not execute.
    }

    function post_here1(){
        //will be nasty char cleaned.
    }

    function post_here2(){
        //will be nasty char cleaned.
    }

}

ご想像のとおり、これはすべてのコントローラーのコンストラクターで記述する必要があります。一度だけ書きたい場合は、最初にコントローラーを基本クラスから拡張し、親のコンストラクターに書き込むことを検討してください。

親コントローラーのコンストラクター:

class MY_Controller extends CI_Controller{
    function __construct(){
        parent::__construct();
        if(!empty($_POST)) array_walk_recursive($_POST, 'nasty_chars_replace');
    }
}

...そしてhome.phpに戻ります:

class Home extends MY_Controller{
    function __construct(){
        parent::__construct();
    }

    function index(){
        //typically a GET request, nasty_chars_replace will not execute.
    }

    function post_here1(){
        //will be nasty char cleaned.
    }

    function post_here2(){
        //will be nasty char cleaned.
    }
}

この基本クラスの継承の使用方法の詳細については、Phil Sturgeon のKeeping It Dryの投稿を参照することをお勧めします。

于 2012-09-19T15:45:30.583 に答える