2016-01-08 6 views
3

У меня есть страница, работающая на http://some.example.com/myiframes/default.aspx. На этой странице есть iframe. Источник iframe/содержит базовое приложение Laravel 5.2.Laravel TokenMismatchExpection при публикации изнутри iframe

URL-адрес страницы Laravel, который является источником 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 App, который расположен на 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.

Я открыл VerifyCsrfToken класс, расположенный в App\Http\Middleware и добавил http://some.example.com в $ за исключением того массива, который не исправить эту проблему.

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

Что может быть причиной этой проблемы? Как я могу исправить проблему?

Edited, Вот мой шаблон

{!! 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

Попробуйте изменить '' to '{{csrf_field()}}'. – maiorano84

+0

@ maiorano84 Я использую {{csrf_field()}}. –

+0

Можете ли вы сбросить оба запроса внутри и вне iframe и посмотреть, что не соответствует. –

ответ

2

Учитывая детали, которые вы задаете в исходном вопросе, кажется, что Laravel ведет себя так, как должен, отказываясь предоставить форму.

Пользователь-агент просматривает http://some.example.com и POST, используя форму https://laravel.example.com, через iframe. Если я не ошибаюсь, это именно то поведение, которое маркеры CSRF предназначены для предотвращения.

Этот вопрос может быть даже дубликатом Laravel 5 TokenMismatchException only in iFrame. Я согласен с принятым ответом.

Если это внутренний сайт и вы готовы принять связанные с ним риски, вы можете добавить исключение для маршрута, к которому вы находитесь, POST ing, как описано в вышеприведенном ответе.

0

Следуйте этим шагам

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

X-CSRF-токен

В дополнение к проверке лексемы CSRF в виде POST, связующее ПО Laravel VerifyCsrfToken также проверит запрос X-CSRF-TOKEN Адэр. Например, вы можете хранить токен в теге «meta»:

После того, как вы создали метатег, вы можете указать библиотеке jQuery, чтобы добавить токен ко всем заголовкам запросов. Это обеспечивает простую и удобную защиту CSRF для приложений на основе AJAX:

$ .ajaxSetup ({ заголовки: { 'X-CSRF-токен': $ ('мета [имя = "CSRF-маркер"]') .attr ('content') } });

X-XSRF-ЗНАК

Laravel также сохраняет маркер CSRF в XSRF-токен печенье. Вы можете использовать значение cookie для установки заголовка запроса X-XSRF-TOKEN. Некоторые фреймворки JavaScript, такие как Angular, делают это автоматически для вас. Маловероятно, что вам нужно будет использовать это значение вручную.

+0

Я не использую никаких запросов Ajax/JS. Я представляю простую форму. Форма работает без проблем, если она не находится в iframe. Проблема возникает, когда я помещаю ее в iframe в другой домен. Имейте в виду, что форма и обработчик запроса формы находятся на ларавом приложении –

+0

@MikeA, Я подробно рассмотрел документ. http://pipwerks.com/2008/11/30/iframes-and-cross-domain-security-part-2/ и поэтому вы должны передать это значение токена через AJAX вручную. Таким образом, он проверит этот токен. –

Смежные вопросы