Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [PHP]Sprawdzanie hasła preg_match()
xeveot
post 24.03.2009, 20:09:59
Post #1





Grupa: Zarejestrowani
Postów: 29
Pomógł: 2
Dołączył: 17.03.2008

Ostrzeżenie: (0%)
-----


Witam

Ma ktoś może jakiś sprawdzony sposób na sprawdzenie hasła pod warunkiem że zawiera:
- małą literę
- wielką literę
- cyfrę od 0 do 9
- znak specjalny

Gdzieś czytałem że można użyć w wyrażeniu znak "?=" ale nie wiem zbytnio jak go zastosować.
Dziękuje i pozdrawiam.
Go to the top of the page
+Quote Post
230005
post 24.03.2009, 20:19:23
Post #2





Grupa: Zarejestrowani
Postów: 316
Pomógł: 36
Dołączył: 2.04.2008

Ostrzeżenie: (0%)
-----


[a-z0-9]/i <- to i na końcu oznacza, że wyrażenie nie jest case sensitive. Znaki specjalne chyba będziesz musiał wpisać ręcznie (nie przypominam sobie żeby była jakaś klasa dla nich), po cyfrach. A w ogóle to tutaj jest odpowiedź :]
Go to the top of the page
+Quote Post
xeveot
post 24.03.2009, 22:43:21
Post #3





Grupa: Zarejestrowani
Postów: 29
Pomógł: 2
Dołączył: 17.03.2008

Ostrzeżenie: (0%)
-----


a takie wyrażenie jest prawidłowe?


  1. <?php
  2. preg_match('/^(?=.+[a-z])(?=.+[A-Z])(?=.+[!@#$%^&*()_+|])(?=.+[0-9])[a-zA-Z0-9!@#$%^&*()_+|]{6,16}$/D', $_POST['haslo'])
  3. ?>


Działać działa ale może ktoś mi powiedzieć jak przerobić je na wyrażenie z tym znaczkiem na końcu "/i "
Go to the top of the page
+Quote Post
230005
post 24.03.2009, 23:04:15
Post #4





Grupa: Zarejestrowani
Postów: 316
Pomógł: 36
Dołączył: 2.04.2008

Ostrzeżenie: (0%)
-----


Wow biggrin.gif Po co aż tak komplikować?questionmark.gif To powinno być poprawne:

  1. <?php
  2. preg_match('/([[:alnum:]]+[!@#$%^&*()_+|]){6,16}/i', $_POST['haslo']);
  3. ?>


[[:alnum:]] to klasa znaków alfanumerycznych. Jeśli jednak chcesz żeby hasło mogło mieć polskie znaki musisz użyć funkcji mb_ereg.
Go to the top of the page
+Quote Post
xeveot
post 25.03.2009, 06:44:24
Post #5





Grupa: Zarejestrowani
Postów: 29
Pomógł: 2
Dołączył: 17.03.2008

Ostrzeżenie: (0%)
-----


EDIT: Sorry działa, dziękuje bardzo

Ten post edytował xeveot 25.03.2009, 06:46:09
Go to the top of the page
+Quote Post
Brick
post 22.05.2009, 08:16:40
Post #6





Grupa: Zarejestrowani
Postów: 107
Pomógł: 9
Dołączył: 16.02.2004
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Szukałem odpowiedzi na bardzo podobne pytanie i znalazłem ten post, niestety podane rozwiązanie jest błędne, ponieważ:
- zwraca true gdy na końcu ciągu jest znak specjalny, a nie dowolne jego wystąpienie.
- warunek {6,16} zwraca true jeżeli wystąp iminimum 6 razy kombinacja: dowolny znak alfanumeryczny potem znak specjalny.

Nie udało mi się niestety napisać takiego jednego wyrażenia, które by sprawdzało wszystkie podane warunki na raz.
Ja zrobiłem to za pomocą czterech oddzielnych wyrażeń:
  1. <?php
  2. $w1 = preg_match("/[A-Z]/",$string);
  3. $w2 = preg_match("/[a-z]/",$string);
  4. $w3 = preg_match("/[0-9]/",$string);
  5. $w4 = preg_match("/[!@#$%^&*()_+|-]/",$string);
  6.  
  7. $sum = $w1+$w2+$w3+$w4;
  8. if ($sum<4) print "Złe hasło";
  9. ?>

Zapewne da się to bardziej uprościć tylko pytanie czy jest sens tracić na to czas.


--------------------
Wszystko należy robić najprościej jak się da, ale nie prościej
Albert Einstein
Go to the top of the page
+Quote Post
Conrado81
post 17.04.2010, 19:59:19
Post #7





Grupa: Zarejestrowani
Postów: 1
Pomógł: 0
Dołączył: 17.04.2010

Ostrzeżenie: (0%)
-----


Ja również szukałem odpowiedzi na bardzo podobne pytanie i również znalazłem ten post biggrin.gif
Stworzyłem coś takiego:
  1. <?php
  2. if (!preg_match('/^[\w!@#$%\^&*\(\)_+\|]{2,16}$/', $haslo)) $zlehaslo = TRUE;
  3. ?>


Ten post edytował Conrado81 17.04.2010, 20:00:06
Go to the top of the page
+Quote Post
Brick
post 28.04.2010, 12:28:21
Post #8





Grupa: Zarejestrowani
Postów: 107
Pomógł: 9
Dołączył: 16.02.2004
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Ale w ogóle sprawdziłeś to?
To zupełnie nie działa, zwraca TRUE w przypadku prostego hasła np "piwo"
To wyrażenie jest spełnione gdy na początku ciąg znaków znajdą się minimum 3 znaki składające się na słowo (włącznie ze znakami podkreślenia). Zupełnie nie o to chodzi przecież.

Da się to zrobić jednym wyrażeniem:

  1. if (preg_match("/^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[!@#$%^&*()_+|-])/",$pass))
  2. print "Dobre hasło";
  3. else
  4. print "Złe hasło";

Nie ja to wymyśliłem (niestety) sad.gif ale rozwiązanie jest dobre, sprawdzone.


--------------------
Wszystko należy robić najprościej jak się da, ale nie prościej
Albert Einstein
Go to the top of the page
+Quote Post
unloco
post 19.08.2010, 19:30:44
Post #9





Grupa: Zarejestrowani
Postów: 31
Pomógł: 0
Dołączył: 13.04.2010

Ostrzeżenie: (0%)
-----


Mógłby ktoś objaśnić wyrażenie

  1. preg_match("/^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[!@#$%^&*()_+|-])/",$pass))


? Gdyż szukam wszędzie i nigdzie nie mogę zobaczyć co oznacza np "?=" oraz ".*"

Rozumiem, że hasło może składać się z:
-dużych liter
-małych liter
-cyfr 0-9
-znaków "!@#$%^&*()_+|-"

Ale tak jak napisałem nie wiem po co jest na początku i na końcu "/" oraz ten znak zapytania ze znakiem równości i kropka z gwiazdką

Z góry dzięki.
Go to the top of the page
+Quote Post
Brick
post 11.09.2010, 22:15:08
Post #10





Grupa: Zarejestrowani
Postów: 107
Pomógł: 9
Dołączył: 16.02.2004
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Cytat
Rozumiem, że hasło może składać się z:...

Nie może tylko musi.

Cytat
Ale tak jak napisałem nie wiem po co jest na początku i na końcu "/"

Wyrażenia regularne ujmuje się w znaki odwrotnego ukośnika, który pełni rolę znaku ograniczającego. Czyli początek i koniec wyrażenia.

Cytat
szukam wszędzie i nigdzie nie mogę zobaczyć co oznacza np "?=" oraz ".*"

Tutaj mamy zastosowany pewien trick z "górnej półki".
Normalnie:
? - oznacza zero lub jedno wystąpienie
* - oznacza zero lub więcej wystąpień
. - oznacza dowolny jeden znak

Ale w naszym przypadku te symbole mają inne znaczenie.
(?= ) oznacza sprawdzenie dopasowania ale bez przesuwania się wzdłuż ciągu znaków. Wyrażenie jest sprawdzane ale dalsze matchowanie startuje od tego samego miejsca, jakby tego wcale nie było. Takie patrzenie w przod, bez ruszania sie z miejsca.
Tak wiec (?=.*[A-Z]) sprawdza, czy jest duza litera gdzies dalej, ale jestesmy nadal przed nia i mozemy sprawdzic czy jest tez cos innego.
Ta sztuczka pozwala na sprawdzenie wystąpień różnych znaków bez sprawdzania kolejności ich wystąpień. Czyli zarówno "A1b" jest poprawne jak i "Ba1".


--------------------
Wszystko należy robić najprościej jak się da, ale nie prościej
Albert Einstein
Go to the top of the page
+Quote Post
everth
post 11.09.2010, 22:24:53
Post #11





Grupa: Zarejestrowani
Postów: 782
Pomógł: 153
Dołączył: 21.07.2010

Ostrzeżenie: (0%)
-----


Jak chcesz mniej więcej złapać jak budować RegExy, to tu masz w miarę sensownie podaną dokumentację z przykładami.


--------------------
Już mi się ani wiedzieć, ani tym bardziej myśleć nie chce.
[Think different]!
Go to the top of the page
+Quote Post
MatBlo
post 24.11.2010, 10:30:29
Post #12





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 27.05.2010

Ostrzeżenie: (0%)
-----


Chciałbym odświeżyć temat, wyrażenie podane przez unloco jak najbardziej działa

Cytat(unloco @ 19.08.2010, 19:30:44 ) *
  1. preg_match("/^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[!@#$%^&*()_+|-])/",$pass))


chciałbym je zmodyfikować tak aby hasło składało się minimum z 8 a maksimum z 30 znaków.
  1. preg_match("/^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[!@#$%^&*()_+|-]){8,30}/",$pass))

niestety podane przeze mnie rozwiązanie nie działa i nie bardzo wiem jak sobie z tym poradzić.

Ten post edytował MatBlo 24.11.2010, 10:31:09
Go to the top of the page
+Quote Post
kiler129
post 24.11.2010, 11:42:45
Post #13





Grupa: Zarejestrowani
Postów: 566
Pomógł: 35
Dołączył: 21.06.2006

Ostrzeżenie: (0%)
-----


Jedna uwaga - a-z nie obejmuje polskich ogonków. Jeśli chcesz aby były dozwolone to musisz je dopisać do wyrażenia.


--------------------
flexiCMS v2 [|||||||+--] 75% done
Go to the top of the page
+Quote Post
MatBlo
post 24.11.2010, 11:48:31
Post #14





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 27.05.2010

Ostrzeżenie: (0%)
-----


Tak wiem wystarczy zamiast A-Z wpisać A-Ż, ale nie z tym mam problem, w każdym razie dzięki za zwrócenie uwagi.

edit.
Problem rozwiązany:
  1. preg_match("/^(?=.{8,})(?=.*[A-Ż])(?=.*[a-ż])(?=.*[0-9])(?=.*[!@#$%^&*()_+|-]).*$/",$pass))


Ten post edytował MatBlo 24.11.2010, 12:45:25
Go to the top of the page
+Quote Post
Brick
post 24.11.2010, 21:59:42
Post #15





Grupa: Zarejestrowani
Postów: 107
Pomógł: 9
Dołączył: 16.02.2004
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Działa dla min. 8 znaków, ale nie ma sprawdzania czy hasło przekracza 30 znaków.
Cytat
wyrażenie podane przez unloco jak najbardziej działa

A ktoś pisał że nie działa?
Dla ścisłości: unloco tylko wkleił wyrażenie ze wcześniejszego posta


--------------------
Wszystko należy robić najprościej jak się da, ale nie prościej
Albert Einstein
Go to the top of the page
+Quote Post
gsk
post 24.11.2010, 22:02:20
Post #16





Grupa: Zarejestrowani
Postów: 129
Pomógł: 4
Dołączył: 21.02.2004
Skąd: z domu

Ostrzeżenie: (0%)
-----


  1. function haslo($haslo, $dlugosc, $minDuze, $minMale, $minLiczby, $minZnaki) {
  2. $minMaleLicz = 0;
  3. $minDuzeLicz = 0;
  4. $minLiczbyLicz = 0;
  5. $minZnakiLicz = 0;
  6. $haslo = iconv('UTF-8', 'ISO-8859-2', $haslo);
  7. for ($i = 0; $i < strlen($haslo); $i++) {
  8. $h = ord($haslo[$i]);
  9. //malelitery i polskie duze litery
  10. if(($h>96 && $h < 123) || $h==177 || $h==230 || $h==234 || $h==179 || $h==241 || $h==243 || $h==182 || $h==188 || $h==191) $minMaleLicz++;
  11. //duzelitery i polskie duze litery
  12. elseif (($h>64 && $h < 91) || $h==161 || $h==198 || $h==202 || $h==163 || $h==209 || $h==211 || $h==166 || $h==172 || $h==175) $minDuzeLicz++;
  13. //liczby
  14. elseif($h > 47 && $h < 58) $minLiczbyLicz++;
  15. //znaki
  16. elseif(preg_match('/[!@#$%^&*()-+_{}|:";\',.\/<>?\[\]\=]/', $haslo[$i])) $minZnakiLicz++;
  17. }
  18. if (strlen($haslo) < $dlugosc || $minMaleLicz < $minMale || $minDuzeLicz < $minDuze || $minLiczbyLicz < $minLiczby || $minZnakiLicz < $minZnaki)
  19. return false;
  20. else
  21. return true;
  22. }
  23.  
  24.  
  25. echo haslo('ĄĆŹml;†sds343aa12!@', 10, 2, 2, 2, 2);


Kiedys takie cos napisalem... Prosta funkcja zwracajaca true w przypadku, gdy haslo spelnia warunki lub false jezeli nie.

Ten post edytował gsk 24.11.2010, 22:05:10


--------------------
pomoglem wcisnij przycisk "pomogl" - dzieki...
Go to the top of the page
+Quote Post
Brick
post 25.11.2010, 19:16:27
Post #17





Grupa: Zarejestrowani
Postów: 107
Pomógł: 9
Dołączył: 16.02.2004
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Tą "prostą funkcję" można zastąpić jedną linijką wyrażenia regularnego:
  1. if (preg_match("/^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[!@#$%^&*()_+|-]).{8,30}$/",$pass))
  2. print "Dobre haslo";
  3. else
  4. print "Złe haslo";

Podane wyrażenie zwraca TRUE jeżeli hasło ma więcej niż 8 znaków ale nie więcej niż 30 znaków oraz jeżeli zawiera:
- jedną małą literę i
- jedną dużą literę i
- jedną cyfrę i
- jeden znak specjalny


--------------------
Wszystko należy robić najprościej jak się da, ale nie prościej
Albert Einstein
Go to the top of the page
+Quote Post
id4
post 24.06.2014, 11:54:02
Post #18





Grupa: Zarejestrowani
Postów: 223
Pomógł: 1
Dołączył: --
Skąd: Rogożnik /K-ce/

Ostrzeżenie: (0%)
-----


Cytat(Brick @ 25.11.2010, 20:16:27 ) *
Tą "prostą funkcję" można zastąpić jedną linijką wyrażenia regularnego:
  1. if (preg_match("/^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[!@#$%^&*()_+|-]).{8,30}$/",$pass))
  2. print "Dobre haslo";
  3. else
  4. print "Złe haslo";

Podane wyrażenie zwraca TRUE jeżeli hasło ma więcej niż 8 znaków ale nie więcej niż 30 znaków oraz jeżeli zawiera:
- jedną małą literę i
- jedną dużą literę i
- jedną cyfrę i
- jeden znak specjalny


Witam

Dobre wyrażenie.
Ma ktoś może takie, które wymaga:
- małej litery
- dużej litery
- cyfry bądź znaku specjalnego
- limitu 6-20 znaków

Z góry dzięki za pomoc.
Go to the top of the page
+Quote Post
Brick
post 24.06.2014, 14:44:09
Post #19





Grupa: Zarejestrowani
Postów: 107
Pomógł: 9
Dołączył: 16.02.2004
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Cytat
Ma ktoś może takie, które wymaga:
- małej litery
- dużej litery
- cyfry bądź znaku specjalnego
- limitu 6-20 znaków

To znaczy hasło jest poprawne jeżeli zawiera przynajmniej jedną małą literę i przynajmniej jedną duża literę i przynajmniej jedną cyfrę lub znak specjalny?
Czyli hasło: Aaaaa1 jest poprawne?

Długość to sprawdzisz funkcją strlen(). Ja preferuję zrobić to oddzielnie żeby napisac użytkownikowi że ma za krótkie lub za długie hasło a nie pisać "niepoprawne" ale nie wiadomo o co dokładnie chodzi.


--------------------
Wszystko należy robić najprościej jak się da, ale nie prościej
Albert Einstein
Go to the top of the page
+Quote Post
id4
post 24.06.2014, 16:05:12
Post #20





Grupa: Zarejestrowani
Postów: 223
Pomógł: 1
Dołączył: --
Skąd: Rogożnik /K-ce/

Ostrzeżenie: (0%)
-----


Cytat(Brick @ 24.06.2014, 15:44:09 ) *
To znaczy hasło jest poprawne jeżeli zawiera przynajmniej jedną małą literę i przynajmniej jedną duża literę i przynajmniej jedną cyfrę lub znak specjalny?
Czyli hasło: Aaaaa1 jest poprawne?

Długość to sprawdzisz funkcją strlen(). Ja preferuję zrobić to oddzielnie żeby napisac użytkownikowi że ma za krótkie lub za długie hasło a nie pisać "niepoprawne" ale nie wiadomo o co dokładnie chodzi.


Jest tak jak piszesz.
Może być też Aaaaa@ i też będzie poprawnie.

EDIT:

Kod
'/^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9!@#$%^&*()_+|-]).{6,20}$/'


Ten post edytował id4 25.06.2014, 10:07:26
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 29.06.2025 - 06:34