2017-03-28 57 views
7

Utworzyłem kilka formularzy w wersji 5.1, teraz używam tych formularzy w innej witrynie przy użyciu ramki IFrame. Te formularze działają we wszystkich przeglądarkach oprócz Safari. Kiedy próbuję przesłać/opublikować dane po wypełnieniu formularzy, pojawia się błąd "Niezgodność tokenu CSRF", nie wiem, jaki jest tutaj problem, token csrf również jest tworzony i wysyłany. Dzieje się tak tylko w przypadku przeglądarki Safari.Laravel 5.1 - Problem niedopasowania tokena z ramkami iframe w przeglądarce Safari Tylko

Czy ktoś może mnie poprowadzić, w jaki sposób mogę się pozbyć tego problemu?

kroki do odtworzenia:

utworzyć formularz, a następnie użyć go poprzez iframe. po przesłaniu formularza generowany jest błąd niezgodności tokenów CSRF.

Jak rozwiązać ten problem? Proszę pomóż!

Przykładowy kod:

<form method="post" action="/step1/{{$voucher->user_id}}" accept-charset="UTF-8"> 
<input name="_method" type="hidden" value="post"> 
{!! csrf_field() !!} 
<div class="row" style="margin-top:15px; margin-bottom:15px;"> 
<div class="col-md-4 col-xs-5 hidden"> 
<input name="voucher_id" type="hidden" value="{{$voucher->id}}" id="voucher_id"> 

    <input class="form-control spin text-center qty1" name="qty" id="qty" type="text" value="1" > 
    <input name="r_full_name" type="hidden" value="" id="r_full_name"> 


</div> 

<div class="col-md-3 col-xs-3"> 
<button type="submit" class="btn btn-theme"><i class="fa fa-shopping-cart" aria-hidden="true"></i> | BUY</button> 
</div> 
</form> 

to przykładowy kod ... znowu to wszystko działa idealnie w każdej innej przeglądarki (FF, Chrome), ale kiedy mogę umieścić ten formularze do iframe w innym miejscu, a następnie uzyskać TokenMissmatch błąd ...

+0

podać nam kod. –

+0

Aktualizuję kod ... ale kod nie jest problemem (działa idealnie w FF i Chrome), kiedy umieszczam go w elemencie iframe w innej witrynie - wtedy przeglądarka Safari sprawia, że ​​mam problem. –

+1

Może uda Ci się odtworzyć token. Spróbuj przeładować klatkę na ładowanie okna nadrzędnego. –

Odpowiedz

4

jest to najprawdopodobniej związane, jak Safari obsługuje ciasteczka i iframe, patrz odpowiedź z this question które cytuje, co wydaje się starszej wersji Safari Developer FAQ który stwierdza

Safari jest dostarczana z zachowawczą polityką dotyczącą plików cookie, która ogranicza plik cookie zapisuje tylko wybrane strony ("nawigowane do") przez użytkownika. Ta domyślna konserwatywna polityka może wprowadzać w błąd witryny oparte na ramkach, które próbują zapisywać pliki cookie i zawieść się pod numerem .

To wyjaśnia, dlaczego masz z tym problemy.

Druga odpowiedź na to pytanie zawiera propozycję rozwiązania, które można znaleźć pod adresem here. Jest to w zasadzie to samo, co przekierowanie do domeny, która jest właścicielem plików cookie, ustawienie sesji i przekierowanie z powrotem, co jest kolejnym rozwiązaniem, które jest wymienione here.

3

Token csrf ma zapobiegać fałszowaniu zleceń między witrynami i to jest to, co robisz, kiedy używasz ramki iFrame! Token uniemożliwia przypadkowym stronom internetowym przesłanie formularza do Twojej witryny. Tak więc formularz wykorzystujący Laravel i token nie będzie działał w iFrame!

Jeśli chcesz opublikować formularz na innej stronie, wyłącz token csrf dla tego formularza lub obsłuż wniosek w taki sposób, aby pomyślnie przejść kontrolę bezpieczeństwa zgodnie z potrzebami.

0

Myślę, że ten wpis może ci pomóc, możesz zmienić politykę dotyczącą plików cookie.

Csfr token problem

0

wyślij żeton dla każdego żądania

$.ajaxSetup({headers: {'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content') } }); 
0

testowym jeśli przeglądarka Safari i strona jest strona główna, a sesja nie jest uruchomiona, Jeśli tak to przekierować okno Początek url do iframe nadrzędnej url

Kroki prowadzące do rozwiązania problemu Laravel Token Mismatch z ramką iframe w Safari przy użyciu przekierowania są następujące:

1) Dodaj trasę

Route::get('/start-session', '[email protected]'); 

2) Dodaj akcji kontrolera

public function startSession() { 
    session()->put('isSessionStarted', true); 
    return redirect('http://www.iframeparentsite.com'); // redirect to website where iframe is hosted 
} 

3) Instalacja modułu jenssegers/agent wykryć przeglądarki Safari https://github.com/jenssegers/agent

composer require jenssegers/agent 

4) Użyj go w sterowniku

use Jenssegers\Agent\Agent; 

5) Przechodzą isSafari, isHomepage i isSessionStarted aby zobaczyć w akcji kontrolera głównej

public function index() 
{ 
    $agent = new Agent(); 
    $this->data['isSafari'] = $agent->is('Safari') && !$agent->is('Chrome'); 
    $this->data['isHomepage'] = true; 
    $this->data['isSessionStarted'] = session()->get('isSessionStarted'); 
    return view('home', $this->data); 
} 

6) Dodać ostrza/JavaScript kod w widoku układu sekcji head

@if ($isSafari && !empty($isHomepage) && empty($isSessionStarted)) 
window.top.location = "{{ url('/start-session') }}"; 
@endif 

Przekierowanie odbywa się jeden raz na stronie głównej i zajmie 1/2 sekundy