2

CakePHP 2.1私は次のコードを持っています

public function getForm($id=null){
        $this->loadModel('DynamicFormResponse');
        /**
         *  Check if form exists 
         */
        $this->form_schema= $this->DynamicForm->isValidForm($id);

        if($this->form_schema == false){
            $this->flash("Invalid form", $this->referer(
                    array('controller'=>"pages", 'action' => 'display')
                    ));           
        }
     ...
     ...

私が直面している問題は、への呼び出しが$this->flash()フラッシュページをレンダリングするだけでなく、コントローラーの実行を継続することです。

だから私が何かをしない限り

if($this->form_schema == false){
    $this->flash("Invalid form", $this->referer(
        array('controller'=>"pages", 'action' => 'display')
    ));
    return;           
}

コントローラは終了しません。

主な問題は、_crsf_errorメソッドが呼び出されたときに発生します

function _csrf_error() {

    $this->flash("csrf Error",  $this->referer(
            array('controller'=>"pages", 'action' => 'display')
    ));
}

フラッシュ メソッドはリダイレクトしないため、csrf 保護はまったく提供されません。メソッド内でreturn;afterを使用しても機能しません。$this->flash()_crsf_error

PS:完全なコードはこちらから入手できます

4

3 に答える 3

6

上記の答えは、flash() メソッドが何をするかについての素晴らしい説明ですが、私にとっては、質問に対する完全な答えではなく、優れた代替手段を提供してくれました。

私は個人的にフラッシュ メソッドを使用したかったので、セッション コンポーネントを使用する必要はありませんでした。Cake 2.x のドキュメントでは、flash() メソッドの 2 番目のパラメーターは CakePHP 相対 URL であると書かれています。これは、次のようにメッセージを表示してから index アクションにリダイレクトする必要があることを意味します。

$this->flash(__("Some message for the user here..."), array("action" => "index"));

私の問題、および元のポスターの問題のように見えるのは、フラッシュメッセージが表示された後、リダイレクトが行われないことでした。

私は自分のアプリケーションでこれを徹底的にテストしましたが、原因はcore.phpのデバッグ設定でした

Configure::write('debug', 0);

リダイレクトを行うには、デバッグ値を「0」に設定する必要があります。なぜそうなのかはわかりませんが、デバッグ設定が 1 以上に設定されているときに約 10 回テストしましたが、10/10 で、フラッシュ メッセージが表示されました。0 に設定すると、すべてが完全に機能します。とにかく、本番環境ではこの設定を 0 に設定する必要があるため、これはあまり問題ではありませんでした。

デバッグがオンのときにリダイレクトが発生しない理由について、他の誰かが何らかの洞察を持っている場合は、私たち全員に教えてください.

お役に立てれば。

于 2013-03-08T22:11:43.240 に答える
5

flash()リダイレクトせず、レンダリングします。関数と非常に似ていますが、render()関数とは異なり、スクリプトの実行を継続しredirect()ます。

それに応じてロジックを編成する必要があるだけで、それを実行したくない場合は、その後に他の行が実行されないようにすることができます。session->setFlash()オプションで、リダイレクトと組み合わせて使用​​できます。

無効な csrf トークンなどの重大なエラーに対処する場合は、攻撃者に適切なメッセージを表示するのではなく、例外をスローすることをお勧めします。ただし、エラー ハンドラを使用して例外レンダリングをきれいにすることはできます。

于 2012-03-21T14:24:51.177 に答える
1

私も同じ問題に直面していました。デバッグモードを0にすると、問題が解決しました。

Configure::write('debug', 0);

そして、デバッグモード 2 でリダイレクトが発生しなかったのは、主な原因が 1 つあります。

リダイレクト ヘッダーが送信される前に、アプリケーションがブラウザに何かを出力しています。これは、任意の前後の (目に見えない) 空白が原因である可能性があります。これにより、「ヘッダーは既に送信されました」という警告が表示され、ブラウザはリダイレクトされません。ここ StackOverflow では、この状況に関する多くの質問があります。たとえば、PHP によって既に送信されたヘッダー

于 2013-06-02T13:41:00.717 に答える