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

"Biblioteka", która będzie walidowała dane, które zostały podane przy logowaniu/rejestracji.

0 głosów
91 wizyt
pytanie zadane 26 czerwca 2016 w PHP, Symfony, Zend przez użytkownika HaKIM Maniak (65,700 punkty)

Zaznaczam, iż takowej nie poszukuję.

Hej,

Chciałbym stworzyć prostą biblioteczkę, która będzie walidowała dane z logowania/rejestracji, chroniła przed sql injection, xss injection, shell injection, i innych.

Chciałbym ją stworzyć tak, aby dało się ją podpiąć do jakiejkolwiek aplikacji.

Niestety, im dalej w las, tym gorzej.

Największy problem jest z stworzeniem klasy, która będzie walidowała dane.

Dajmy na to:

Mamy formularz rejestracji, a w nim:

  • Login
  • Email
  • Hasło
  • Powtórzenie hasła

 Dane wysyłam metodą POST, w kontrolerze sprawdzam czy zostały one wysłane, i opakowuję je w metodę, dajmy na to: valAll(); - Do niej możemy wsadzić kolejno: 

$foo->valAll($_POST['login'], $_POST['email'], $_POST['password'], $_POST['re_password'])

Lub cokolwiek.

Nastaje problem... Skąd dana  metoda będzie wiedziała co i jak walidować? Aby dla email sprawdzała czy jest poprawny, nie zawiera [ ] ' - ; i innych nieprawidłowych znaków, dla hasła czy ma przynajmniej 6 liter, dla loginu czy ma przynajmniej 3 litery, i nie ma w nim również znaków specjalnych?

Jesteśmy w ogóle stanie zrobić metodę valAll(); czy każde dane będziemy musieli walidować inną metodą? valEmail(), valPassword(), valLogin(), valSqlInjection(), lub inne.

Jak sprawić, aby biblioteka była dostępna dla każdej aplikacji, która chciałby walidować swoje dane, aby użytkownik nie musiał grzebać w kodzie źródłowym, a po prostu włożyć to, co ma być walidowane, do metody?

Zaznaczam iż całość jest dla nauki, a nie tworzenia biblioteki z prawdziewgo zdarzenia, które będzie chronić dane przed wszelkimi możliwymi atakmi.

Streszczając:

  • Jak stworzyć bibliotekę, którą będzie można dołączyc do jakiegokolwiek projektu, napisanego obiektywnie?
  • Czy możliwe jest stworzenie metody, dajmy na to: valAll();, która wiedziałby co z daną rzeczą zrobić, po włożeniu do niej danych takich jak: vallAll($_POST['login'], $_POST['email'], $_POST['haslo]); czy jest to niemożliwe, i należałoby do wszystkiego tworzyć osobną metodę?
  • Jak wyglądałaby przykładowa struktura katalogów?
  • Co będzie mi wymagane?

1 odpowiedź

+3 głosów
odpowiedź 26 czerwca 2016 przez użytkownika Comandeer Ekspert (326,530 punkty)
wybrane 26 czerwca 2016 przez użytkownika HaKIM
 
Najlepsza

Walidator powinien używać reguł do walidacji. Wówczas tablica $_POST byłaby walidowana zgodnie z tym, co sam ustaliłeś.

Jak mogłoby to wyglądać?

$validator = new Validator( new RuleSet( [
	'email' => [
		new Rule/Required,
		new Rule/EMail
	],

	'login' => [
		new Rule/Required,
		new Rule/Length( 3, 255 ),
		new Rule/AlphaNum
	]
] ) );

// Zawartość $_POST:
// [ 'email' => 'spam@spam.pl', 'login' => '!@' ]

$errors = $validator->validate( $_POST )->getErrors();

var_dump( $errors ); // [ 'login' => [ 'length', 'alphanum' ] ]

 

komentarz 26 czerwca 2016 przez użytkownika HaKIM Maniak (65,700 punkty)
edycja 26 czerwca 2016 przez użytkownika HaKIM

No dobrze.

Ale...

Jak to działa?

    'email' => [
        new Rule/Required,
        new Rule/EMail
    ],
 
    'login' => [
        new Rule/Required,
        new Rule/Length( 3, 255 ),
        new Rule/AlphaNum
    ]

Nie jestem w stanie oganąć tego, co po takim new Rule/Required otrzymuje 'login'...

$validator, to główna klasa, która zawiera w sumie klasę, z ustawieniami, do której dodajemy tablicę, a w tablicy są indeksy, które zawierają inne klasy, z walidacją, ale w __contructor, gdyż bez podanej metody, albo to jest namepspace...

Nie rozumiem.

Pódję przetestować podobny kod, tę tablicę, ale daję 99.99% iż nie uda mi się dojść do tego, jak coś podobnego stworzyć.

komentarz 26 czerwca 2016 przez użytkownika Comandeer Ekspert (326,530 punkty)

To są po prostu reguły walidacji. Wiadomo, że dane znajdujące się pod indeksem login muszą istnieć, mieć długość od 3 do 255 znaków i być alfanumeryczne.

komentarz 26 czerwca 2016 przez użytkownika HaKIM Maniak (65,700 punkty)

Tego się domyśliłem. :)

Problem jest z tym, jak to dokładnie działa?

'email' => [
    new Rule/Required,
    new Rule/EMail
],

Co by się stało, gdybyśmy użyli var_dump() na email?

Pierwszy raz spotykam się z takim wyglądem tablicy, nie jestem w stanie pojąć co tu się dzieje.

1
komentarz 26 czerwca 2016 przez użytkownika Comandeer Ekspert (326,530 punkty)
To po prostu tablica obiektów – nic więcej.
komentarz 26 czerwca 2016 przez użytkownika efik Maniak (65,430 punkty)
Ładnie pokazane OOP Comandeer ;) Plusik.

Poczyta o OOP, interfejsach i zrobi taki vaildator.

Ważne, aby nie pchać wszystkiego do jednej klasy.
komentarz 26 czerwca 2016 przez użytkownika HaKIM Maniak (65,700 punkty)
Zrobić - zrobię. Później mam zamiar dać kod na forum, w celu oceny. :> Nie jestem pewien ile może to potrwać... Tymbardziej widzę to wtedy, kiedy Comandeer daje mi taki kod, a ja mam dosłownie  wielkiego brainfucka; gdy staram się go przeanalizować.
komentarz 26 czerwca 2016 przez użytkownika HaKIM Maniak (65,700 punkty)
Prosiłbym jeszcze o strukutre katalgów, która będzie dobra do tego typu projektu. Następnie będę mógł zamknąć temat.
komentarz 26 czerwca 2016 przez użytkownika Comandeer Ekspert (326,530 punkty)
komentarz 26 czerwca 2016 przez użytkownika HaKIM Maniak (65,700 punkty)
Dziękuję.

Podobne pytania

0 głosów
1 odpowiedź 46 wizyt
pytanie zadane 14 października 2016 w PHP, Symfony, Zend przez użytkownika ThePatrykOOO Gaduła (4,530 punkty)
0 głosów
1 odpowiedź 78 wizyt
pytanie zadane 14 maja 2015 w PHP, Symfony, Zend przez użytkownika Gandalf Obywatel (1,300 punkty)
...