Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Captcha i MVC
Forum PHP.pl > Forum > PHP
kicaj
Zgodnie z MVC zabezpieczenie typu Captcha powinno byc sprawdzane w Modelu czy Kontrolerze?
ddiceman
W kontrolerze. Captcha odpowiada za sterowanie: autoryzowanie dostepu lub jego brak. Nie ma specjalnie duzo wspolngo z danymi.
kejk
Cytat(ddiceman @ 26.07.2008, 17:43:34 ) *
W kontrolerze. Captcha odpowiada za sterowanie: autoryzowanie dostepu lub jego brak. Nie ma specjalnie duzo wspolngo z danymi.


Jak to nie ma wiele wspólnego z danymi? Captha powinna być sprawdzana przy walidacji danych przesłanych z formularza do zapisu - czyli w modelu.
wrzasq
moze to troche przerost formy nad trescia, ale jesli masz dosc rozbudowany system i chcesz w jakis dosc elastyczny sposob zeimplementowac CAPTCHA, to ja bym to w "ostatecznej formie ewolucji" widzial tak, ze masz klase kontrolera do captchy, zupelnie odseparowana od samego przetwarzania danych i w modelu masz najpierw odwolanie do metody kontrolera CAPTCHA i w zaleznosci o jego rezultatow podejmujesz kolejne kroki innych klas, ale to jest tak jak juz powiedzialem wersja dosc rozbudowana, takze w mniejszych ujeciach moze stanowic wspomniany "przerost formy nad trescia".
ddiceman
Cytat(kejk @ 27.07.2008, 00:23:22 ) *
Jak to nie ma wiele wspólnego z danymi? Captha powinna być sprawdzana przy walidacji danych przesłanych z formularza do zapisu - czyli w modelu.

Ale captchy nie skladujesz dluzej niz moment po wygenerowaniu - nie jest Twoja dana skladowana jak np. tresc artykulu czy dane uzytkownika.
Cysiaczek
Tak na moje oko, to zależy od upodobań. Powinna być sprawdzana tam, gdzie dane użytkownika, najlepiej na samym początku. Jako, że jest to raczej zabezpieczenie, to powinno być odseparowane od pozostałych danych. Dla przykładu: Załóżmy, że mamy klasę walidującą dane
  1. <?php
  2. $modelValidator=new ModelValidator();
  3. $modelValidator->addTrueFilter($captcha); // taki twór, który wymusza, aby $captcha miała metodę validate() zwracającą booleana
  4. $modelValidator->validate($model);
  5. ?>


Captcha jest teraz dołączana do walidacji, ale nie jest związana z modelem, bo i z jakiej racji? Mogę sobie zażyczyć, aby kliknięcie w link pokazujący jakąś treść było poprzedzone sprawdzeniem użytkownika. Nie ma tu wówczas modelu danych - jest tylko żądanie, którego warunkiem wykonania jest poprawnie wpisany kod. Jest to wówczas bardziej związane z autoryzacją.
Na pewno nie powinno to zostać wmieszane w sam model danych.

Pozdrawiam.
kicaj
To powiem tak, ja to widze w ten sposob (na przykladzie Cake):
Stworzylem sobie komponent Captcha, ktory implementuje w Kontrolerze.
Poniewaz captcha wystepuje w tym przypadku przy formularzu (dowolnym), wiec najpierw waliduje pola z formularza, a na koncu pole typu captcha, wyglada to mniejwiecej tak w modelu:
  1. <?php
  2. class Model extends AppModel
  3. {
  4. var $validate = array(
  5.  'kod' => array(
  6.  'rule' => array( 'userDefined', 'Model', 'captcha' ), // czyt. wlasna funkcja w modelu 'Model' metody 'captcha'
  7.  'message' => 'Niepoprawny kod!' ) );
  8.  
  9.  function captcha( $check )
  10.  {
  11.  // tutaj chcialbym porownac $check (wartosc pola 'kod' z formularza)
  12.  // z zarejestrowanym w sesji kodem, chcialo by sie uzyc:
  13.  // $this -> Session -> read( 'captcha );
  14.  // dostep jest jednak z modelu zabroniony do sesji
  15.  if( $check == $wartosc_session )
  16.  {
  17.  return true;
  18.  }
  19.  else
  20.  {
  21.  return false;
  22.  }
  23.  }
  24. }
  25. ?>

Uzyc w Modelu wbudowanej obslugi sesji nie moge. Zawsze jest rozwiazanie z uzyciem tablic $_SESSION ale to chyba nie tedy droga?

Wiec jak to rozwiazac?

Wydaje mi sie ze captcha poprostu powinna byc sprawdzana jak inne dane formularza, czyli w modelu...
LBO
Captcha powinno być sprawdzane tam gdzie następuje walidacja. Jeżeli framework waliduje w modelu - zrób to w modelu. Jeżeli walidacja jest transparentna (np w plikach konfiguracyjnych) - zrób to tam.
Nie chodzi o upodobania, tylko o narzędzia smile.gif

Ja korzystam z Agavi. Tam walidacja jest ustawiana w pliku XML. Dopisałem sobie walidator captchy - jeżeli sie nie zgadza - rzuca błędem walidacji, jeżeli jest okay to dane z formularza trafiają do kontrolera i captchą nie przejmuje się w ogóle (nawet nieraz usuwam z danych z formularza).
kicaj
Ja tez uwazam ze w Modelu, pytanie teraz jak rozwiazac dostep z modelu do sesji (w Cake oczywiscie)?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.