2014-07-19 107 views
5

我正在創建表單,並且無論我如何做,CSRF _token總是相同!Laravel 4 - CSRF令牌永不改變

如果我使用

{{ Form::open([route' => 'login']) ]] 

這並不重要,或者如果我使用

{{ Form::token() }} 

這是每一次的相同。 即使我成功提交表單後。我想它會被消耗,並會產生一個新的,但沒有!

我錯過了配置步驟嗎?

注:我知道,如果laravel_session得到再生的_token是不同的,但我明白了,CRSF令牌也避免多個表單提交機制,所以它應該在頁面的每次刷新時改變,或者至少在一次成功的投遞後被消費,否?

+0

你在哪裏看過'CRSF令牌也是避免多個表單提交的機制? – delmadord

+0

它也在這裏討論http://stackoverflow.com/questions/17239586/laravel-4-prevent-multiple-form-submissions-csrf-token – delmadord

+0

雖然這篇文章確實解釋了避免表單重新提交的方法,但它沒有解釋關於令牌的行爲沒有被消耗。我想破解這個,因爲它好像是一個安全漏洞。 –

回答

9

不需要爲每個請求刷新CSRF標記,每個會話生成標記也是安全的。請看Owasp cheat sheet以獲得更好的解釋。

爲每個請求重新生成令牌都可以完成,但可能會導致可用性問題。我認爲這就是爲什麼Laravel實現令牌每會話的原因。

+0

謝謝,這是一個非常詳盡的解釋。這似乎是最終的行爲。 –

+0

如果我註銷並重新登錄,是否會將其視爲會話更改?我的意思是如果我註銷並重新登錄,令牌會改變嗎? – Rohan

+0

@Rohan - 實際上它取決於應用程序在用戶註銷時執行的操作。從技術上講,會話cookie在瀏覽器關閉之前可以保持有效,儘管當用戶註銷時會丟棄該會話。 – martinstoeckli

1

從代碼,唯一的_tokenregenerateToken相關事件是在Illuminate/Session/Store,線條89,551和571. OCCURENCES是:

public function start() 
{ 
    $this->loadSession(); 

    if (! $this->has('_token')) $this->regenerateToken(); 

    return $this->started = true; 
} 

public function token() 
{ 
    return $this->get('_token'); 
} 

public function regenerateToken() 
{ 
    $this->put('_token', str_random(40)); 
} 

這意味着,令牌被僅再生,當不出席Sessions。如果需要,您必須自己重新生成它,例如Session::forget('_token');