0

すべての ajax 呼び出しに定義済みの応答形式を使用しています。

リクエストが次の場合success、サーバーは次のように応答します。

{"status":true,"data":{"name":"person","age":2}}

必要ありませんのでご注意くださいdata

リクエストが失敗した場合、私は取得します

{"status":false,"reason":"You are not authorised."}

SO すべての応答にはstatusfield があり、 status の場合はfieldFALSEがありreasonます。

問題はCSRF、Codeigniter で保護を有効にし、トークンの有効期限が切れた/失敗した場合にシステムが出力することです。

The action you have requested is not allowed.

これは HTML コンテンツです。

セキュリティクラスを拡張して、リクエストがAjaxを介している場合はjson_encoded形式を維持し、それ以外の場合はhtml形式を使用することは可能ですか.(私はコアを変更したくありません)

ありがとう。

4

1 に答える 1

2

このエラー メッセージは、CI_Exceptions::show_errorメソッド (system/core にあります) から表示されます。このクラスを通常の方法で拡張し、このメソッドをオーバーライドして、このエラーをキャッチし、必要なものを返すことができます。

メソッドをオーバーライドすることでメソッド内の呼び出しを取り除くことができるCI_Security::csrf_show_errorので、単に呼び出されることはありません

show_error('The action you have requested is not allowed.');

これはおそらくより堅牢です。

CI_Exceptionsまたは、この内部クラスを攻撃することもできます。このエラーには特定のエラー コードが付いていないため、更新間で中断する可能性のあるメッセージ (現在はハードコードされています) と一致する必要があります。結果のクラスは次のようになります。

class MY_Exceptions extends CI_Exceptions {
    public function show_error($heading, $message, $template = 'error_general', $status_code = 500) {
        if ($message == 'The action you have requested is not allowed.') {
            // handle this error your way
        } else {
            // send every other error to the original handler
            parent::show_error($heading, $message, $template, $status_code);
        }
    }
}
于 2012-11-22T20:22:57.110 に答える