2012-03-21 28 views
2

使用CakePHP 2.1我有以下代碼CakePHP的 - 控制器::閃光燈()不重定向

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;$this->flash()_crsf_error方法不起作用。

PS:可用here

回答

5

flash()不重定向的完整代碼,它呈現。它與render()函數非常相似,它將繼續執行腳本,與redirect()函數不同。

您只需要相應地組織您的邏輯,以便在其後不執行其他行。或者,您可以使用session->setFlash()與重定向結合使用。

當處理像無效的csrf標記這樣的嚴重錯誤時,我建議拋出一個異常,而不是向攻擊者提供一條好消息。不過,您可以使用錯誤處理程序來優化異常渲染。

+0

異常似乎是處理它的最佳方式。謝謝 – Gautam 2012-03-21 15:06:03

+0

自2.7.0版以來,setFlash已被棄用:您應該只使用Flash來創建Flash消息。 setFlash()將被完全刪除在蛋糕3.0 – 2017-10-09 21:10:49

6

儘管上面的答案是對flash()方法的一個很好的解釋,但對我而言,它並沒有完全回答這個問題,而是給出了一個很好的選擇。

我個人希望使用flash方法,所以我不必使用會話組件,並且發現自己也卡在了我的flash消息中。在Cake 2.x文檔中,它表示flash()方法的第二個參數是一個CakePHP相對URL。這意味着以下內容應顯示一條消息,然後重定向到索引操作。

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

我的問題,以及它看起來像原始海報的問題是,它顯示你的Flash消息,但沒有做重定向後。

我與我的應用程序全面測試這一點,罪魁禍首是在core.php中的調試設置

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

調試值在爲了重定向發生被設置爲「0」。我不知道爲什麼會出現這種情況,但是當我的調試設置設置爲1或更高時,我測試了它大約10次和10次,我剛剛收到了閃存消息。如果我將它設置爲0,則一切正常。這對我來說並不是很重要,因爲無論如何,生產環境應該將此設置設置爲0。

如果其他人對調試開啓時爲什麼沒有發生重定向有一些瞭解,請啓發我們所有人。

希望這會有所幫助。

+0

很好的捕獲,幫助我瞭解問題是什麼。 – Gabriel 2014-05-26 15:29:48

1

我也面臨同樣的問題。在調試模式爲0後,我得到了我的問題的解決方案。

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

爲什麼重定向沒有與調試模式2發生的事情是一個主要的原因,

發送的重定向頭之前,您的應用程序輸出的東西到瀏覽器。這可能是由任何之前或之後的(不可見的)空白引起的。這將導致'頭文件已發送'警告,並且瀏覽器不會重定向。關於StackOverflow的這種情況,有很多問題,例如:已經由PHP發送的頭文件