2016-01-08 51 views
3

我有一個頁面在http://some.example.com/myiframes/default.aspx上運行。該頁面有一個iframe。 iframe源代碼/包含Laravel 5.2基本應用程序。Laravel TokenMismatchExpection當從一個iframe中發佈

My Laravel頁面URL「這是iframe的來源」是https://laravel.example.com

https://laravel.example.com表單有一個提交按鈕。當使用點擊它,他/她打即https://laravel.example.com/disply/survey

但每次都在同一個域中的另一條路,我提出我得到下面的異常形式

TokenMismatchException in VerifyCsrfToken.php line 67: 

爲了確保我很清楚,在http://some.example.com/myiframes/default.aspx我的代碼看起來是這樣的

我laravel應用,該應用是位於https://laravel.example.com這裏的網頁是我的形式

<form method="POST" action="https://laravel.example.com/disply/survey" accept-charset="UTF-8" class="form"> 
<input name="_token" type="hidden" value="Dk6SN4WzO4brbvdnBO6JZ7e1lBGjmYz8GQJ1lYFo"> 
<input name="survey_id" type="hidden" value="10"> 
<input name="call_id" type="hidden" value="667"> 
<input name="pools" type="hidden"> 

<input name="alt_id_1" type="hidden" value="250"> 
<input name="alt_id_2" type="hidden" value="5"> 
<input name="alt_id_3" type="hidden"> 
<input name="alt_id_4" type="hidden"> 
<input name="alt_id_5" type="hidden"> 
<input name="alt_id_6" type="hidden"> 
<input name="alt_id_7" type="hidden"> 
<input name="alt_id_8" type="hidden"> 
<input name="alt_id_9" type="hidden"> 
<input name="alt_id_10" type="hidden"> 


<input name="alt_string_1" type="hidden"> 
<input name="alt_string_2" type="hidden"> 
<input name="alt_string_3" type="hidden"> 
<input name="alt_string_4" type="hidden"> 
<input name="alt_string_5" type="hidden"> 
<input name="alt_string_6" type="hidden"> 
<input name="alt_string_7" type="hidden"> 
<input name="alt_string_8" type="hidden"> 
<input name="alt_string_9" type="hidden"> 
<input name="alt_string_10" type="hidden"> 

<div class="text-center"> 
    <input class="btn btn-primary" type="submit" value="Start Survey"> 
</div> 

</form> 

表單在iframe之外完美工作。只有當我在iframe中時纔會出現問題。

我打開位於VerifyCsrfTokenApp\Http\Middleware並添加 http://some.example.com到除數組$這並沒有解決問題。

protected $except = [ 
    'http://some.example.com' 
]; 

什麼可能導致此問題? 我該如何糾正這個問題?

編輯,這裏是我的模板

{!! Form::open([ 
       'url' => route('my.surveys.display'), 
       'class' => 'form', 
       'method' => 'post' 
       ]) !!} 
{!! Form::hidden('survey_id', $survey_id) !!} 
{!! Form::hidden('call_id', $call_id) !!} 
{!! Form::hidden('pools', $pools) !!} 
{!! Form::hidden('call_type', $type) !!} 


{!! Form::hidden('alt_id_1', $alt_id_1) !!} 
{!! Form::hidden('alt_id_2', $alt_id_2) !!} 
{!! Form::hidden('alt_id_3', $alt_id_3) !!} 
{!! Form::hidden('alt_id_4', $alt_id_4) !!} 
{!! Form::hidden('alt_id_5', $alt_id_5) !!} 
{!! Form::hidden('alt_id_6', $alt_id_6) !!} 
{!! Form::hidden('alt_id_7', $alt_id_7) !!} 
{!! Form::hidden('alt_id_8', $alt_id_8) !!} 
{!! Form::hidden('alt_id_9', $alt_id_9) !!} 
{!! Form::hidden('alt_id_10', $alt_id_10) !!} 


{!! Form::hidden('alt_string_1', $alt_string_1) !!} 
{!! Form::hidden('alt_string_2', $alt_string_2) !!} 
{!! Form::hidden('alt_string_3', $alt_string_3) !!} 
{!! Form::hidden('alt_string_4', $alt_string_4) !!} 
{!! Form::hidden('alt_string_5', $alt_string_5) !!} 
{!! Form::hidden('alt_string_6', $alt_string_6) !!} 
{!! Form::hidden('alt_string_7', $alt_string_7) !!} 
{!! Form::hidden('alt_string_8', $alt_string_8) !!} 
{!! Form::hidden('alt_string_9', $alt_string_9) !!} 
{!! Form::hidden('alt_string_10', $alt_string_10) !!} 

<div class="text-center"> 
    {!! Form::submit('Start Survey', ['class' => 'btn btn-primary', 'id' => 'start_survey']) !!} 
</div> 
+0

嘗試更改''到'{{csrf_field()}}'。 – maiorano84

+0

@ maiorano84我正在使用{{csrf_field()}}。 –

+0

您可以轉儲iframe內外的請求,並查看不匹配的內容。 –

回答

2

鑑於您在原始問題中提供的細節,似乎Laravel的行爲與拒絕允許您提交表單時的行爲完全相同。

用戶代理正在通過iframe瀏覽http://some.example.comPOST表格到https://laravel.example.com。如果我沒有弄錯,這正是CSRF令牌旨在預防的行爲。

這個問題甚至可能是Laravel 5 TokenMismatchException only in iFrame的副本。我同意那裏接受的答案。

如果這是一個內部網站,並且您願意接受相關風險,那麼您可以爲上面引用的答案中所描述的路由添加一個例外情況,如POST ing。

0

按照此步驟

https://laravel.com/docs/master/routing#csrf-x-csrf-token

X-CSRF-TOKEN

除了檢查的CSRF標記爲一POST參數,Laravel VerifyCsrfToken中間件也會檢查X-CSRF-TOKEN請求阿德。例如,您可以將令牌存儲在「meta」標記中:

創建元標記後,您可以指示像jQuery這樣的庫將令牌添加到所有請求標頭。這提供了簡單,方便CSRF保護您的基於AJAX的應用程序:

$ .ajaxSetup({ 頭:{ 'X-CSRF-TOKEN':$( '元[NAME = 「CSRF令牌」]') .attr('content') } });

X-XSRF-TOKEN

Laravel還存儲在一個XSRF-TOKEN cookie中的CSRF令牌。您可以使用cookie值來設置X-XSRF-TOKEN請求標頭。一些JavaScript框架,比如Angular,會自動爲你做。您不太可能需要手動使用此值。

+0

我沒有使用任何Ajax/JS請求。我正在提交一個簡單的表單。當表單不在iframe中時,表單沒有問題。當我將它放入不同域的iframe時,問題就會發生。請記住,表單和表單請求處理程序都在laravel應用程序 –

+0

@MikeA, 我已經通過詳細的文檔從這裏。 http://pipwerks.com/2008/11/30/iframes-and-cross-domain-security-part-2/ 等等,您必須手動通過AJAX傳遞該標記值。所以,它會驗證這個令牌。 –

相關問題