2015-08-10 4 views
2

У меня есть рабочий вид:Laravel 5 TokenMismatchException только в плавающем фрейме

{!! Form::open() !!} 
      <div class="form-group"> 
       <label for="name">Name</label> 
       <input type="text" class="form-control" id="name" placeholder="Name"> 
      </div> 
      <div class="form-group"> 
       <label for="division">Division</label> 
       <input type="text" class="form-control" id="division" placeholder="Division"> 
      </div> 
     {!! Form::submit('send', array('class'=>'btn btn-success pull-right')) !!} 
    {!! Form::close() !!} 

Это работает как автономные страницы подача и хранение входов. Теперь мне нужно поместить это в iframe, чтобы его можно было вызвать с другого веб-сайта. Когда я делаю это с:

<iframe src="http://1.1.1.1/register_user" style="width:600px;height:500px;"></iframe> 

в форме отображается, но когда пользователь отправляет они получают следующее:

TokenMismatchException in VerifyCsrfToken.php line 53: 
1. in VerifyCsrfToken.php line 53 
2. at VerifyCsrfToken->handle(object(Request), object(Closure)) 
3. at call_user_func_array(array(object(VerifyCsrfToken), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 124 
4. at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in ShareErrorsFromSession.php line 54 
5. at ShareErrorsFromSession->handle(object(Request), object(Closure)) 
6. at call_user_func_array(array(object(ShareErrorsFromSession), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 124 
7. at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in StartSession.php line 62 
8. at StartSession->handle(object(Request), object(Closure)) 
9. at call_user_func_array(array(object(StartSession), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 124 
10. at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in AddQueuedCookiesToResponse.php line 37 
11. at AddQueuedCookiesToResponse->handle(object(Request), object(Closure)) 
12. at call_user_func_array(array(object(AddQueuedCookiesToResponse), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 124 
13. at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in EncryptCookies.php line 59 
14. at EncryptCookies->handle(object(Request), object(Closure)) 
15. at call_user_func_array(array(object(EncryptCookies), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 124 
16. at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in CheckForMaintenanceMode.php line 42 
17. at CheckForMaintenanceMode->handle(object(Request), object(Closure)) 
18. at call_user_func_array(array(object(CheckForMaintenanceMode), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 124 
19. at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) 
20. at call_user_func(object(Closure), object(Request)) in Pipeline.php line 103 
21. at Pipeline->then(object(Closure)) in Kernel.php line 122 
22. at Kernel->sendRequestThroughRouter(object(Request)) in Kernel.php line 87 
23. at Kernel->handle(object(Request)) in index.php line 54 

Это то, что я вижу в журналах:

[2015-08-10 00:52:21] production.ERROR: exception 
'Illuminate\Session\TokenMismatchException' in /home/forge/default/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php:53 
Stack trace: 
#0 [internal function]: Illuminate\Foundation\Http\Middleware\VerifyCsrfToken->handle(Object(Illuminate\Http\Request), Object(Closure)) 
#1 /home/forge/default/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(124): call_user_func_array(Array, Array) 
#2 /home/forge/default/vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php(54): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) 
#3 [internal function]: Illuminate\View\Middleware\ShareErrorsFromSession->handle(Object(Illuminate\Http\Request), Object(Closure)) 
#4 /home/forge/default/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(124): call_user_func_array(Array, Array) 
#5 /home/forge/default/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(62): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) 
#6 [internal function]: Illuminate\Session\Middleware\StartSession->handle(Object(Illuminate\Http\Request), Object(Closure)) 
#7 /home/forge/default/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(124): call_user_func_array(Array, Array) 
#8 /home/forge/default/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php(37): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) 
#9 [internal function]: Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse->handle(Object(Illuminate\Http\Request), Object(Closure)) 
#10 /home/forge/default/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(124): call_user_func_array(Array, Array) 
#11 /home/forge/default/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php(59): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) 
#12 [internal function]: Illuminate\Cookie\Middleware\EncryptCookies->handle(Object(Illuminate\Http\Request), Object(Closure)) 
#13 /home/forge/default/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(124): call_user_func_array(Array, Array) 
#14 /home/forge/default/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/CheckForMaintenanceMode.php(42): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) 
#15 [internal function]: Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode->handle(Object(Illuminate\Http\Request), Object(Closure)) 
#16 /home/forge/default/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(124): call_user_func_array(Array, Array) 
#17 [internal function]: Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) 
#18 /home/forge/default/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): call_user_func(Object(Closure), Object(Illuminate\Http\Request)) 
#19 /home/forge/default/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(122): Illuminate\Pipeline\Pipeline->then(Object(Closure)) 
#20 /home/forge/default/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(87): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter(Object(Illuminate\Http\Request)) 
#21 /home/forge/default/public/index.php(54): Illuminate\Foundation\Http\Kernel->handle(Object(Illuminate\Http\Request)) 
#22 {main} 

Что я делаю неправильно, чтобы вызвать несоответствие в iframe и как его исправить?

+0

Laravel 5 ожидает, что вы передадите токен CSRF со всеми данными формы, чтобы убедиться, что он был отправлен из надежного источника. Ошибка, которую вы получаете, заключается в том, что токен не был включен или не соответствовал ожидаемому значению. – Jeemusu

ответ

5

Laravel 5 имеет глобальный middleware включенный под названием VeryifyCsrfToken, который проверяет все запросы POST для маркера для применения Cross-site request forgery protection.

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

Позволяет пользователям отправлять вашу форму из iframe в другом домене именно в том виде, в котором защита LARARS CSRF пытается предотвратить.

Существует способ отключить проверку CSRF для определенных URL-адресов. Вы можете добавить новый элемент в массив $except, чтобы исключить этот URL из проверки CSRF.

Http/Промежуточное/VerifyCsrfToken.php

<?php 

namespace App\Http\Middleware; 

use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier; 

class VerifyCsrfToken extends BaseVerifier 
{ 
    /** 
    * The URIs that should be excluded from CSRF verification. 
    * 
    * @var array 
    */ 
    protected $except = [ 
     'your/uri' 
    ]; 
} 
+0

Я добавляю в домены вроде: protect $ except = ['http: some domain.com/form_page.html']; но я все еще получаю ту же ошибку. Это правильный способ добавить в домен? – neil

+0

Извините, я должен был быть более ясным.Вы не добавляете домен, вы добавляете URL-адрес, который вы хотите отключить CSRF-защиту для вашего приложения. Это должен быть тот же URL, на который отправляется ваша форма. Кроме того, вам нужно знать, что при этом вы открываете приложение до CSRF-атак через этот URL-адрес. – Jeemusu

0

ответы @Jeemusu «s обеспечивает решение, хотя несколько комментариев и другой предложенное решение после прочтения: https://discussions.apple.com/thread/4156939?tstart=0

  • Для меня, это не имеет ничего общего с предотвращением CSRF, другие браузеры не мешают этому, я бы сказал, что это больше связано с предотвращением отслеживания.
  • На странице Apple предлагается следующее: проблема возникает только в том случае, когда домен iframe не был посещен первым (и это то, что я наблюдал).
  • Одним из решений было бы, чтобы домен вызывающего абонента установил cookie при поступлении пользователя, перенаправил на вызываемый домен, чтобы «считать посещение», а затем перенаправить обратно в вызываемый домен (который будет читать первые установленные файлы cookie, а не перенаправить снова).

Я бы сказал, что отключение защиты CSRF является небезопасной идеей.