• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

mvc - csrf a post

0 głosów
534 wizyt
pytanie zadane 27 listopada 2017 w PHP przez idgu Nowicjusz (140 p.)

Witam.

 

Uwaga:

 login/new ( {controller}/{method} )

Mam następującą sytuację:

Formularz wyświetlam w login/new. Następnie po wypełnieniu żądanie POST zostaje wysłane do login/create gdzie przechodzi walidacje. W przypadku niepowodzenia ponownie zostaje wyświetlony formularz  z poprzednimi danymi POST ("efekt zapamiętywania").

Czy wyświetlanie formularza z poziomu innej metody niż pierwotna jest dobrym pomysłem? Niby dzięki temu mogę przesłać dane POST do widoku, no ale..np. 

Jeżeli użytkownik zostanie przekierowany na login/create, a następnie odświeży stronę to do serwera trafią poprzednie dane, co zaowocuje wyrzuceniem błędu o niepoprawności tokenu. Aby tego uniknąć można użyć sesji i za każdym niepowodzeniem przekierowywać do login/new. No ale znowu nie jest to tak wygodne jak renderowanie widoku.

Co o tym myślicie? Czy taka sytuacja jest dopuszczalna? Jakieś inne alternatywy?

Kod można podejrzeć tutaj

1 odpowiedź

0 głosów
odpowiedź 27 listopada 2017 przez Codeboy Stary wyjadacz (12,120 p.)

A czy odświeżenie strony powinno nam ponownie wysyłać formularz? Według mnie nie.
Ten problem likwiduje pattern Post/Redirect/Get

Bo tak to u Ciebie się odbywa tak? Nie wiem czy to twój główny problem.

komentarz 27 listopada 2017 przez idgu Nowicjusz (140 p.)

Tak, tylko chodzi o to że z pozycji  login/new mam dostęp do POST i dzięki temu mogę zgrabnie wysłać dane do widoku np. w taki sposób: 

View::renderTemplate('/Login/new.html', [
                'email' => $_POST['email'],
                'remember_me' => $remember_me,
                'token_form' => Input::generateFormToken()
            ]);

 

Jeżeli chciałbym skorzystać z tego wzorca, to po 2 GET nie mam już dostępu do danych z formularza. Tak jak pisałem można to zrealizować za pomocą sesji (co dla mnie wydaje się nieeleganckie). Dlatego pytam, czy ktoś widzi tutaj inne rozwiązanie?

Warto zauważyć, że w bieżącym przykładzie odświeżenie strony powoduje ponowne wysłanie żądania tylko w wypadku niepowodzenia (więc nie istnieje możliwość dublowania zapytań). 

komentarz 27 listopada 2017 przez Codeboy Stary wyjadacz (12,120 p.)

No ale nadal jeśli na przykład chcielibyśmy wyczyścić formularz odświeżeniem to nie da rady no nie? :D 

Co do pytania to nie wiem jak to jest w PHP. W Javie (Spring) dane między widokami po redirectcie można przerzucać za pomocą klasy RedirectAttributes. Może masz coś podobnego w PHP? Jak nie to musisz poczekać na kogoś od PHP laugh 

komentarz 28 listopada 2017 przez Assasz Nałogowiec (30,460 p.)

Tak, jest coś podobnego, tzw. query stringi ;) Czyli po prostu przekazanie parametrów getem do przekierowywanej akcji. Wyglądało by to jakoś tak:

// login/new/{attr}
public function newAction($attr = null)
{
     View::renderTemplate('/Login/new.html', [
            'attr' => $attr
            'token_form' => Input::generateFormToken()
        ]);
}

public function createAction()
{
      //tutaj przekierowanie do akcji new i przekazanie parametru
}

Rozwiązanie z rozdzieleniem tego na dwie metody nie wiem czy takie dobre, ale ASP.NET MVC tak robi z tego co się orientuję...

komentarz 28 listopada 2017 przez idgu Nowicjusz (140 p.)
W momencie użycia query string, przekierowanie do innej metody generuje zbędny kod. Wtedy lepiej przekierowywać do tej samej. Minus query str. jest taki, że wszystko siedzi w adresie, no i nie wyśle nim obiektu.

Podobne pytania

+1 głos
1 odpowiedź 231 wizyt
pytanie zadane 19 lipca 2021 w JavaScript przez yapyap Obywatel (1,730 p.)
0 głosów
0 odpowiedzi 564 wizyt
pytanie zadane 5 lipca 2019 w PHP przez nielotweb Bywalec (2,240 p.)
0 głosów
1 odpowiedź 483 wizyt
pytanie zadane 19 maja 2017 w PHP przez Dani7778 Użytkownik (550 p.)

93,772 zapytań

142,730 odpowiedzi

323,382 komentarzy

63,367 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...