Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Preg_match walidacja danych
Lethys
post 20.11.2011, 18:42:46
Post #1





Grupa: Zarejestrowani
Postów: 642
Pomógł: 2
Dołączył: 9.03.2006

Ostrzeżenie: (30%)
XX---


Witam,

Od dwóch dni główkuje jak zrobić poprawnie sprawdzenie danych przesyłanych w formularzu.

Chcę aby były akceptowane tylko litery małe, duże + polski alfabet + spacje + cyfry

Próbowałem :

  1. // pierwsza próba
  2. preg_match('#^[A-z0-9ąćęłńóśźżĄĆĘŁŃÓŚŹŻ]*$#is', $zmienna)
  3.  
  4. //druga próba
  5. preg_match('/^([a-żA-Ż0-9_] [a-żA-Ż0-9_]+)$/i', $zmienna)
  6.  
  7.  


Przegooglowałem, poczytałem, próbowałem na wiele sposobów ale nadal mi nie działa tak jak chcę.

Ten post edytował Lethys 20.11.2011, 18:45:49


--------------------
filmy podobne do - wyszukiwarka podobnych filmów
motywacja do działania - Bądź Lepszy
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 11)
Noidea
post 20.11.2011, 22:10:12
Post #2





Grupa: Zarejestrowani
Postów: 226
Pomógł: 61
Dołączył: 20.08.2010

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


Pierwszy sposób jest dobry, tylko zapomniałeś spacji w klasie znaków i błędnie zdefiniowałeś litery (zerknij na http://www.asciitable.com/ jakie znaki masz między dużą literą A a małą literą z)


--------------------
Go to the top of the page
+Quote Post
Lethys
post 21.11.2011, 11:28:38
Post #3





Grupa: Zarejestrowani
Postów: 642
Pomógł: 2
Dołączył: 9.03.2006

Ostrzeżenie: (30%)
XX---


Poprawiłem znaki, żeby było A-Za-z. Chyba o to Ci chodziło.

Obecnie to wygląda tak:


  1. preg_match('#^[a-zA-Z0-9ąćęłńóśźżĄĆĘŁŃÓŚŹŻ]*$#is', $zmienna)




Obecnie nadal nie działa, jak zmienna ma w sobie np. ;" to nadal przechodzi przez moją "zaporę ochronną" smile.gif

jak dodać spację, jak zrobić żeby uzyskać mój żądany efekt?

Ten post edytował Lethys 21.11.2011, 11:28:48


--------------------
filmy podobne do - wyszukiwarka podobnych filmów
motywacja do działania - Bądź Lepszy
Go to the top of the page
+Quote Post
mortus
post 21.11.2011, 11:42:59
Post #4





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


Spacja to \040, zatem cały regexp powinien wygldać tak:
^[a-zA-Z0-9ąćęłńóśźżĄĆĘŁŃÓŚŹŻ\040]*$
Przełączniki si nie są Ci potrzebne. Powinno działać, więc jeśli nie działa, to pokaż więcej kodu.
Go to the top of the page
+Quote Post
by_ikar
post 21.11.2011, 11:51:07
Post #5





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

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


spacja to również \s

Kod
preg_match('#^[\w\d\sąćęłńóśźżĄĆĘŁŃÓŚŹŻ]*$#is', $zmienna);


Jeżeli dajesz flagę "i", to nie musisz pisać a-zA-Z, wystarczy że dasz a-z lub \w. Ta flaga ignoruje wielkość liter.

Go to the top of the page
+Quote Post
mortus
post 21.11.2011, 11:59:40
Post #6





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


Cytat(by_ikar @ 21.11.2011, 11:51:07 ) *
spacja to również \s

Kod
preg_match('#^[\w\d\sąćęłńóśźżĄĆĘŁŃÓŚŹŻ]*$#is', $zmienna);


Jeżeli dajesz flagę "i", to nie musisz pisać a-zA-Z, wystarczy że dasz a-z lub \w. Ta flaga ignoruje wielkość liter.

\s to nie tylko spacja, a biały "pusty" znak, jak np. znak nowej linii, czy tabulator.

Ten post edytował mortus 21.11.2011, 12:00:48
Go to the top of the page
+Quote Post
Lethys
post 21.11.2011, 17:49:11
Post #7





Grupa: Zarejestrowani
Postów: 642
Pomógł: 2
Dołączył: 9.03.2006

Ostrzeżenie: (30%)
XX---


Jeszcze mam 2 problemy z datą:

Pierwsza sprawa:

Format daty: 2011-11-19

Preg_match :

  1. if (!preg_match('/^([0-9]{4})[-\.]([0-9]{1,2})[-\.]([0-9]{1,2})/', $data_utworzenia)) {
  2. $problem = TRUE;
  3. echo("<p id='uwaga'><h2>Błędne dane do usunięcia. DATA $data_utworzenia</h2></p>");
  4. }


czyli niby wszystko ok ale zmieniam w bazie danych datę na np. 2011-11-19as i mi nie wykrywa, że data nie jest poprawna.


Druga sprawa:

Jak zrobić preg match pod taki tekst:

941387/Jakis-cel
377871/Robienie-obiadu

To będzie coś takiego?? :

  1. preg_match('/^([0-9]{6})[\057][a-zA-Z\055])/', $data_utworzenia))


Ten post edytował Lethys 21.11.2011, 17:50:03


--------------------
filmy podobne do - wyszukiwarka podobnych filmów
motywacja do działania - Bądź Lepszy
Go to the top of the page
+Quote Post
zegarek84
post 21.11.2011, 18:47:04
Post #8





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

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


w pierwszym przypadku zakończ wyrażenie dolarem, czyli:
'/^([0-9]{4})[-\.]([0-9]{1,2})[-\.]([0-9]{1,2})$/'
w drugim nawet nie patrzysz gdzie otwierasz a gdzie zamykasz nawiasy + najlepiej tak robić wyrażenie coby je zaczynać i kończyć ^$
'/^([0-9]{6})\/([a-zA-Z\-]*)$/'


--------------------
Jeśli twoja ręka rusza do przodu powstrzymaj swój gniew; gdy wyprzedza cię twój gniew - wycofaj rękę.

Go to the top of the page
+Quote Post
Lethys
post 22.11.2011, 17:08:50
Post #9





Grupa: Zarejestrowani
Postów: 642
Pomógł: 2
Dołączył: 9.03.2006

Ostrzeżenie: (30%)
XX---


Mam jeszcze jeden przypadek.

W moim portalu user może wrzucać linki z różnego rodzaju poradnikami.

Linki te są wzucane do bazy więc chciałbym odrzucić "link" powodujące sql_injection.


Zrobiłem to w ten sposób:

  1. if(preg_match('#^[\:\;\"\'\<\>]*$#is', $_POST['link']) and $_POST['link']!=NULL){


Ale przepuszcza mi link gdzie jest np. ;

Jak zrobić aby te znaki nie były akceptowalne?


--------------------
filmy podobne do - wyszukiwarka podobnych filmów
motywacja do działania - Bądź Lepszy
Go to the top of the page
+Quote Post
zegarek84
post 23.11.2011, 00:23:10
Post #10





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

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


skoro chciałeś wykluczyć zestaw znaków i uzyskać jego odwrotność (wszystkie oprócz) to daszek stosuje się na początku klamry [^znaki], przy czym nie myl tego daszka z daszkiem na początku wyrażenia regularnego, gdzie on oznacza, iż wyrażenie ma się dopasowywać od początku... znak "*" znaczy tyle co {0,}, czyli 0 lub wiele, tutaj raczej chciałeś zastosować znak "+" który znaczy {1,} co najmniej 1 znak (zwróć uwagę na przecinek)... wszystko zależy, jak dokładnie chcesz sprawdzać te adresy - można by wymodzić jakieś ogólne wyrażenie ale to wcześniej ktoś musiałby podać jakieś ograniczenia....

Jeśli chodzi o SQL iniection to przede wszystkim zainteresuj się PDO i funkcjami prepare, lub chociaż mysqli i też funkcjami prepare...

Zależy, jak daleko chcesz iść ze sprawdzaniem poprawności adresów - czasami ktoś się pomyli i choć adres strukturę będzie miał poprawną to nie będzie nigdzie prowadził - można to też sprawdzić ale to inny temat...

ogólne wyrażenie na adres mogło by wyglądać (przy czym nie chce mi się sprawdzać jakie są najdziwniejsze znaki i bodajże znak ";" chyba też może występować, podobnie jak procenty czy polskie znaki (wszystko zależy, kto z jakiej przeglądarki skopiuje i jakie kodowanie otrzyma..)

przykładowe wyrażenie mogło by wyglądać np. w ten sposób:
Kod
/^(?:https?\:\/\/)?(?:[wW]{3}\.)?(?!.*(?:[\-\/\.]){2,})[a-zA-Z0-9_\-\.]{2,}\.[a-zA-Z]{2,5}(?:\/[a-zA-Z0-9_!\/\|\+\%\.\-\?\=\&\#]*)?$/

(?!.*(?:[\-\/\.]){2,}) - to znaczy, że nigdzie dalej ma się nie dopasować do występujących pod rząd naraz 2 znaków "-" lub "." lub "/"
jeśli jest jeszcze część poza domeną to reszta musi się zaczynać od znaku "/"
tam sobie możesz pododawać jakieś dozwolone / zabronione znaki...

SKORO LINKI WKLEJAJĄ Z ZEWNĄTRZ, TO ZAŁOŻYŁEM, IŻ DOMENA W LINKU TEŻ MUSI BYĆ [a-zA-Z0-9_\-\.]{2,}\.[a-zA-Z]{2,5}, choć teraz wprowadzili, że i w domenie może być nawet cyrylica ^^, więc zamiast tego można by jakiś bardziej ogólny schemat napisać... zależy co chcesz ^^


--------------------
Jeśli twoja ręka rusza do przodu powstrzymaj swój gniew; gdy wyprzedza cię twój gniew - wycofaj rękę.

Go to the top of the page
+Quote Post
Lethys
post 23.11.2011, 10:28:14
Post #11





Grupa: Zarejestrowani
Postów: 642
Pomógł: 2
Dołączył: 9.03.2006

Ostrzeżenie: (30%)
XX---


Dziękuje za tak wyczerpującą odpowiedź smile.gif

Tylko zrodziło mi się pytanie w głowie czy nie łatwiej po prostu wypisać zakazane znaki (które w adresie strony nie występują) i jeżeli dane adres je posiada to blokować dalszy skrypt?

Druga sprawa, czy blokując wszystkie "niebezpieczne" dane w formularzu i POST przez właśnie preg_match nie bronie się przed sql_injection?


--------------------
filmy podobne do - wyszukiwarka podobnych filmów
motywacja do działania - Bądź Lepszy
Go to the top of the page
+Quote Post
zegarek84
post 23.11.2011, 10:46:47
Post #12





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

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


Cytat(Lethys @ 23.11.2011, 10:28:14 ) *
Druga sprawa, czy blokując wszystkie "niebezpieczne" dane w formularzu i POST przez właśnie preg_match nie bronie się przed sql_injection?

A może tak zamiast się przed tym bronić to uczynić je poprawnymi i bezpiecznymi??

Wszystko zależy, jakie masz typy formularzy...

Firma: Jan Kowalski "Primawera"

I co - w powyższym nie pozwolisz na wprowadzanie cudzysłowów?? Odpowiednio spreparowany kod jeśli dane potem nie są odpowiednio wyświetlane pozwala na rozwalenie kodu html... gdy do wyświetlania wystarczy coś w stylu htmlspecialchars. Fakt, jeśli w bazie nie chcesz mieć śmieci to jakoś minimalnie pod kontem poprawności powinno to się kontrolować... co do SQL iniection to jak już wspomniałem najlepiej prepare w PDO...

o adresie strony to wspomniałem właśnie o tym - czyli chyba prościej w drugą stronę no to np. (ale baaardzo ograniczona filtracja)
Kod
/^(?!.*(?:[\-\.]){2,})[^\s]{2,}\.[a-zA-Z]{2,5}(?:\/[^\s]*)?$/

dodaj sobie tam do tablicy znaków zakazanych co tam uważasz... i początek (?!.*(?:[\-\.]){2,}) jest tam nie potrzebny...


--------------------
Jeśli twoja ręka rusza do przodu powstrzymaj swój gniew; gdy wyprzedza cię twój gniew - wycofaj rękę.

Go to the top of the page
+Quote Post

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: 14.08.2025 - 03:24