Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Walidacja formularza
Forum PHP.pl > Forum > PHP
Kas
Wiem, że temat przewija się regularnie na forum. Jednak przygotowuję ważną aplikację, a dokładna walidacja formularzy to dosłownie sprawa życia i śmierci. Akurat piszę moduł logowania:

  1. $login = strip_tags($_POST['login']);
  2.  
  3. $unwanted = array("'", "/", "(", ")", "[", "]", ";", ",", "?");
  4. $login = str_replace($unwated, "", $login);
  5. if(ctype_alnum($login)
  6. {
  7. if(is_string($login)
  8. {
  9. //logowanie
  10. }
  11. }


Czy jest jeszcze jakaś funkcja o której zapomniałem? Czy można jakoś poprawić powyższy kod? Z góry dzięki. smile.gif
Fifi209
Zamiast zabraniać używania jakiś znaków, po prostu określ te, które użytkownik może wprowadzić np.

  1. preg_match('/^[a-z0-9]{6,10}$/', $_POST['login'])

Przykład dla znaków a-z i 0-9 od 6 do 10 znaków długości.
Kas
Do tego służy funkcja ctype_alnum, która jest szybsza. Obecnie mam taki kod:

  1. $login = '';
  2. $password = '';
  3.  
  4. if(!empty($_POST))
  5. {
  6. if(is_string($_POST['login']) && is_string($_POST['login']))
  7. {
  8. if(ctype_alnum($_POST['login']) && ctype_alnum($_POST['login']))
  9. {
  10. $login = strip_tags($_POST['login']);
  11. $password = strip_tags($_POST['password']);
  12. //logowanie
  13. }
  14. }
  15. }


Zastanawiam się czy jest sens sprawdzać długość zmiennej, wtedy mógłbym zrobić jednak tak:

  1. $login = '';
  2. $password = '';
  3.  
  4. if(!empty($_POST))
  5. {
  6. if(is_string($_POST['login']) && is_string($_POST['login']))
  7. {
  8. if(preg_match('/^[a-z0-9]{6,10}$/', $_POST['login']) && preg_match('/^[a-z0-9]{6,10}$/', $_POST['password'])))
  9. {
  10. $login = strip_tags($_POST['login']);
  11. $password = strip_tags($_POST['password']);
  12. //logowanie
  13. }
  14. }
  15. }


Jakieś uwagi?

nospor
if(is_string($_POST['login']) && is_string($_POST['login']))
Bardzo "ciekawy" warunek wink.gif

Cytat
preg_match('/^[a-z0-9]{6,10}$/', $_POST['password']

Ludzie chcą mieć bezpieczne hasło, w którym mogą dawać niestandardowe znaki, a Ty ich ograniczasz tylko do najmniejbezpiecznych liter i cyfr. No nie tędy droga. I jeszcze to ograniczenie na 10znaków. A może ja mam hasło składające się z 20 znaków? Co tobie To szkodzi?
Kas
Długość loginu i hasła nie ma znaczenia, bo wszystko będzie później solone i hashowane. Ograniczenie do 10 znaków to efekt CTRL+V. Zastanawiam się tylko na możliwością przeciążenia serwera poprzez wysłanie niezwykle długiego stringa. O ile wiem w PHP nie ma limitu długość stringa, a liczenie hasha z 1 000 000 000 znaków (1 GB) może chwilę potrwać i zająć trochę pamięci. Obecna wersja:

  1. $login = '';
  2. $password = '';
  3.  
  4. if(!empty($_POST))
  5. {
  6. if(is_string($_POST['login']) && is_string($_POST['login']))
  7. {
  8. if(ctype_alnum($_POST['login']) && ctype_alnum($_POST['password']))
  9. {
  10. $login = strip_tags($_POST['login']);
  11. $password = strip_tags($_POST['password']);
  12. //logowanie
  13. }
  14. }
  15. }


albo

  1. $login = '';
  2. $password = '';
  3.  
  4. if(!empty($_POST))
  5. {
  6. if(is_string($_POST['login']) && is_string($_POST['login']))
  7. {
  8. if(preg_match('/^[a-z0-9]{4,32}$/', $_POST['login']) && preg_match('/^[a-z0-9]{8,32}$/', $_POST['password']))
  9. {
  10. $login = strip_tags($_POST['login']);
  11. $password = strip_tags($_POST['password']);
  12. //logowanie
  13. }
  14. }
  15. }
nospor
Jak jakiś kretyn ci wyśle 1GB tekst, to php się wyłoży jeszcze zanim dojdzie do Twojego IF wink.gif

Cytat
Długość loginu i hasła nie ma znaczenia, bo wszystko będzie później solone i hashowane

1) Login też będziesz solił i hashował?
2) Ty mi hashy nie wyjaśniaj. Ja to wiem i dlatego zwróciłem Tobie uwagę na bzdurne ograniczenie 10 znaków dla hasła.

No i nadal nie pozwalasz mi na wpisanie hasła składającego się z czegoś więcej niż tylko cyfra i litera. Ble. tongue.gif

$password = strip_tags($_POST['password']);
strip_tags dla hasła jest bezsensu, a wręcz nie może go być.

Cytat
Ograniczenie do 10 znaków to efekt CTRL+V.
To jak dajesz nam coś do oceny/analizy to patrz co piszesz. Skad mamy wiedzieć czy to na co patrzymy to wymysł ctrc+v czy Twojej wyobraźni wink.gif

Przykładowo ta mała bzdura którą już ci opisałem wcześniej:
if(is_string($_POST['login']) && is_string($_POST['login']))
nadal jest w Twoim kodzie i się do niej nie ustosunkowałes
Kas
Wybacz, chyba dzisiaj się nie wyspałem. smile.gif

  1. $login = '';
  2. $password = '';
  3.  
  4. if(!empty($_POST))
  5. {
  6. if(is_string($_POST['login']) && is_string($_POST['password']))
  7. {
  8. if(ctype_alnum($_POST['login']) && ctype_alnum($_POST['password']))
  9. {
  10. $login = strip_tags($_POST['login']);
  11. $password = strip_tags($_POST['password']);
  12. //logowanie
  13. }
  14. }
  15. }


albo

  1. $login = '';
  2. $password = '';
  3.  
  4. if(!empty($_POST))
  5. {
  6. if(is_string($_POST['login']) && is_string($_POST['password']))
  7. {
  8. if(preg_match('/^[a-zA-Z0-9]{4,32}$/', $_POST['login']) && preg_match('/^[a-zA-Z0-9]{4,32}$/', $_POST['password']))
  9. {
  10. $login = strip_tags($_POST['login']);
  11. $password = strip_tags($_POST['password']);
  12. //logowanie
  13. }
  14. }
  15. }


Dodałem duże i małe litery, niech moja strata będzie. Czemu:

  1. $password = strip_tags($_POST['password']);


nie powinno być? Wiem, że po preg_match() albo ctype_alnum() raczej nie ma sensu, ale czemu nie powinno być? Jestem kiepski z ywrażeń regularnych, więc przy preg_match było małe CTRL+V. wink.gif

Odpowiadając jeszcze na Twoje pytanie: tak, login również będzie hashowany, a hasło solone i hashowane.
nospor
Nadal ograniczasz użytkwonika tylko do cyfr i lter. Kiedy wkońcu zrozumiesz, ze to cholernie złe ograniczenie na hasło!?
Po co nasz się pytasz o opinie na temat skryptu, skoro w ogóle nie słuchasz co się do Ciebie pisze?
To nie chodzi o to, że ja tak mówię i tak ma być, tylko o to chodzi, że wiedza i praktyka ogromnej masy ludzi już od dawna mówi, że hasło składające się tylko z liter i cyfr to g#@$#o a nie hasło.

Czemu strip_tags jest złe dla hasła? Ano temu, że jak wkońcu łaskawie pozwolisz komuś na wpisanie innych znaków niż litery i cyfry do hasła, to nagle się okaże że ktoś jako hasło podał: <blabla>mojehasło</blabla> a ty robiąc strip_tags na tym, zmieniasz kolesiowi hasło.
A co ci da że używasz strip_tags na haśle? Nic, kompletnie nic. Przed niczym to nie zabezpiecza.

Cytat
Odpowiadając jeszcze na Twoje pytanie: tak, login również będzie hashowany
Dobra, nie mam więcej pytań....
No dobra, mam. Po co będziesz hashował login? Jak ty masz potem zamiar wyświetlać login użytkownika, skoro je shashujesz?
Kas
Login użytkownika, jak sama nazwa wskazuje, będzie służył do logowania. Dalej użytkownicy będą rozpoznawani po numerze identyfikacyjnym.

Już od dawna wiem, że uważasz to ograniczenie za złe. Uzasadnij. Przed zdobycie loginów i haseł, w przypadku kradzieży bazy danych, chroni hashowanie i solenie. W przypadku podsłuchania szyfrowanej transmisji lub keyloggera w systemie operacyjnym użytkownika, nawet najdłuższe hasło z chińskimi krzaczkami będzie niewystarczające. Przed atakiem brute force bezpośrednio przez stronę będzie chronił limit nieudanych logowań. Widzisz jeszcze jakieś inne podatności?

Chcę walidować dane od użytkownika tak mocno jak to tylko możliwe. W myśl zasady nieograniczonego braku zaufania...
nospor
Cytat
Login użytkownika, jak sama nazwa wskazuje, będzie służył do logowania.
Login użytkownika, jak praktyka wskazuje, jest wyświetlany w bardzo wielu serwisach. I nawet tam do indentyfikacji, głównie służy ID, zaś login służy do wizualnego wyświetlania. Choćby tu na forum. Rozmawiam z Kas a nie numerem 10715

Kas nie będę ci nic udawadniał. Jest kupa mądrzejszych osób od tego i nie będę niedowiarkowi tłumaczył tak podstawowej wiedzy.
Jedyne co mogę ci powiedzieć na szybko, to stosowanie róznorakich znaków zwiększa siłę hasła - tyle w temacie. Jak nie wierzysz to nie wierz. Twoja sprawa.

Cytat
W myśl zasady nieograniczonego braku zaufania...
Jest też inna zasada, która mówi, że jak robi coś bardzo wiele stworzeń, znaczy że tak ma być.
Jedzmy więc gówno, przecież miliardy much nie mogą się mylić tongue.gif

Wszystko jest dla ludzi, wyrażenia regularne też, czekolada też. Ale każda rzecz stosowana bez namysłu, odbija się po pewnym czasie czkawką. Twój "super bezpieczny" skrypt też ci się kiedyś odbije czkawką. Przykładowo ja bym miał średnie zaufanie do serwisu, w którym ze "względów bezpieczeństwa" nie mogę w hasłe podać znaku . czy też <. Moje zaufanie do całej reszty skryptu, pisanego przez takiego programiste, zmalałoby niemalże do zera i unikałbym takiego serwisu jak ognia.
Fifi209
Cytat(Kas @ 10.10.2011, 12:07:27 ) *
Do tego służy funkcja ctype_alnum, która jest szybsza.

Nie zwróciłem uwagi na nią, może ze względu na str_replace które jest tam niepotrzebne? ctype + strlen i tak login masz przefiltrowany

Co do hasła, po prostu hash z solą, nic więcej nie potrzeba.
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.