![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 3 Pomógł: 0 Dołączył: 31.07.2012 Ostrzeżenie: (0%) ![]() ![]() |
Zabrałem się za prace Inżynierską (specjalistyczny CMS)
Zacznę od tego ze moja znajomość PHP pozwala żeby go napisać Pytanie brzmi czy moje rozwiązanie jest tym najlepszym Parę pytań na początek: (chodzi o wprowadzanie danych w Panelu Admina) Walidacja formularzy Czy sprawdzać każdą zmienną przez preg_match? a może warto robić to w Java Script? lub wystarczy za pomocą PDO chronić się przed sql injection, a co wprowadzi użytkownik w danym polu jest nie ważne? a może inna metoda? |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 1 527 Pomógł: 438 Dołączył: 28.06.2011 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Cytat Czy sprawdzać każdą zmienną przez preg_match? NIE. A po co? Do tego podchodzi się inaczej. Pamiętaj, że najlepsza możliwa walidacja jest wówczas gdy dokładnie wiemy czego się mamy spodziewać. Jeżeli przykładowo ma to być liczba - to preg_match jest zbędny. Staraj się "przewidywać" i planować to co użytkownik może wprowadzić - w przypadku takich rzeczy jak na przykład imię, które nie jest może tak istotne można sobie walidacje nieco uprościć ale i tak musisz zabezpieczać się przed XSS czyli eliminować wpisy zawierające podejrzane znaki - nikt przecież nie ma w imieniu znaku > ani < itd.. Tutaj przyda się preg_match. Cytat a może warto robić to w Java Script? Walidacja musi być po stronie serwera przed podaniem jej do bazy (zakładając, że używasz PDO w taki sposób by eliminować SQL-inj.). Dodanie walidacji po stronie klienta czyli javascript zależy od chęci i czasu nad projektem - należy też pamiętać, że walidacja JS musi być taka sama jak walidacja PHP i zmiana w jednej musi ciągnąć za sobą zmianę w drugiej. Jest to ogólnie zabieg pomagający użytkownikowi. Jeżeli nie chcesz robić pełnej walidacji JS to zrób przynajmniej sprawdzanie czy są wypełnione wymagane pola przed wysłaniem tego do PHP. Cytat lub wystarczy za pomocą PDO chronić się przed sql injection, a co wprowadzi użytkownik w danym polu jest nie ważne? To podejście jest strasznie nie zdrowe - bardzo szybko okazuje się, że ludzie wpisują rozmaite głupoty a silnik MySQL przykładowo pozwala na wprowadzanie dziwnych danych innego typu pod dany typ bez wyrzucania błędów zatem zapisują się jeszcze większe idiotyzmy nie wspominając o XSS itp... Nie myśl sobie że jeśli robisz panel administracyjny dla "zaufanych" użytkowników, którzy raczej nie będą chcieli sobie samemu zrobić krzywdę, to możesz odpuścić bezpieczeństwo (nikt przecież nie będzie próbował zrobić sql-injection w panelu admina...). Jeśli ktoś niechcący dostanie się do takiego panelu to ma otwartą drogę - PA powinien zatem być porządnie zabezpieczony. Co do innych metod poszukaj info o filter_var czy validate filters Walidację można wykonywać na wieeeele sposobów:
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 1 233 Pomógł: 87 Dołączył: 6.03.2009 Ostrzeżenie: (40%) ![]() ![]() |
Wyrażenia regularne trzeba jeszcze potrafić pisać.
Na krótkim stringu, błędnie napisane wyrażenie prześlizgnie się niezauważone. Na długim stringu zawiesi system. Kilka przykładów: http://blogs.msdn.com/b/bclteam/archive/20.../10/370690.aspx http://stackoverflow.com/questions/1930135...n-large-matches Podsumowując: Samodzielne pisanie wyrażeń odpada o ile ktoś napisał i przetestował je wcześniej. Zawsze polecam biblioteki PEAR. Tym razem nie będzie inaczej: http://pear.php.net/package/Validate Pierwsza wersja została opublikowana 2002-08-18. Blisko 10 lat temu! Gwarancja stabilności jakiej nie znajdziesz nigdzie indziej. |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 590 Pomógł: 107 Dołączył: 25.10.2011 Ostrzeżenie: (0%) ![]() ![]() |
Wyrażenia regularne trzeba jeszcze potrafić pisać. Truizm, pasujący do wszystkiego: do pisania wyrażeń regularnych, do pisania obiektowego, aż w końcu do pisania programów w ogóle. Na krótkim stringu, błędnie napisane wyrażenie prześlizgnie się niezauważone. Na długim stringu zawiesi system. Kilka przykładów: [ Doskonałe przykłady, które pokazują, jak nie należy pisać wyrażeń regularnych. W obu przypadkach użyto patternów, które spowodowały nieoptymalne obliczanie/dopasowywanie wyrażenia, i powodując gigantyczne zapotrzebowanie na zasoby (pamięć/cpu). Jak dla mnie jest to kwintesencja "jak nie pisać wyrażeń regularnych". Cytat(wNogachSpisz) Podsumowując: Samodzielne pisanie wyrażeń odpada o ile ktoś napisał i przetestował je wcześniej. Trochę niegramatycznie, ale zakładam, że chodzi Ci o to, by nie próbować pisać wyrażeń, lecz korzystać z gotowców? No to piękny model proponujesz. Nie uczmy się sami lecz korzystajmy z gotowców. Nie piszmy prac dyplomowych sami, lecz korzystajmy z gotowców. Mało tego: zamknijmy wszystkie szkoły, po co młodych uczyć czegoś nowego (dla nich) - niech korzystają z gotowców. Dziękuję, ale to podejście dla mnie jest nieakceptowalne. |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 1 233 Pomógł: 87 Dołączył: 6.03.2009 Ostrzeżenie: (40%) ![]() ![]() |
zakładam, że chodzi Ci o to, by nie próbować pisać wyrażeń, lecz korzystać z gotowców? No to piękny model proponujesz. Nie uczmy się sami lecz korzystajmy z gotowców. Nie piszmy prac dyplomowych sami, lecz korzystajmy z gotowców. Mało tego: zamknijmy wszystkie szkoły, po co młodych uczyć czegoś nowego (dla nich) - niech korzystają z gotowców. Dziękuję, ale to podejście dla mnie jest nieakceptowalne. W biznesie nie ma miejsca na eksperymenty. Kod produkcyjny powinien być dobrze zdebugowany. Praca nie musi polegać na napisaniu kazdego najdrobniejszego elementu samodzielnie, opłaca się budować z małych, dobrze przetestowanych klocków. Truizm, pasujący do wszystkiego: do pisania wyrażeń regularnych, do pisania obiektowego, aż w końcu do pisania programów w ogóle. Truzim, tyle że na tym zdaniu nie skończyłem wypowiedzi, więc nie wiem dlaczego się przychrzaniasz. |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 590 Pomógł: 107 Dołączył: 25.10.2011 Ostrzeżenie: (0%) ![]() ![]() |
Truzim, tyle że na tym zdaniu nie skończyłem wypowiedzi, więc nie wiem dlaczego się przychrzaniasz. Zgadza się, nie skończyłeś. Bo od tego zacząłeś. Poparłeś to przykładami źle napisanych wyrażeń regularnych, a na końcu podsumowałeś, że (ja tak zrozumiałem): jak nie umiesz pisać wyrażeń regularnych, to lepiej się za to nie bierz (i weź coś innego). Tymczasem ja nie tyle "przychrzaniam się", co po prostu z takim podejściem walczę. Warto się nauczyć czegokolwiek (choćby dyskutowanych tu wyrażeń regularnych). Jest to bowiem element języka, więc elementarną wiedzę warto mieć. A czym będziemy sprawdzać dane z formularzy, to już jest inna bajka. Nie twierdzę, że regexp jest panaceum na wszystko. Praca nie musi polegać na napisaniu kazdego najdrobniejszego elementu samodzielnie, opłaca się budować z małych, dobrze przetestowanych klocków. Tylko że ktoś te klocki też musi zbudować (i przetestować). Zresztą, skoro ludzie robią sobie własne frameworki, nie widzę przeszkód, by samemu robić sobie zestaw funkcji/obiektów do walidacji danych z formularzy... |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 1 233 Pomógł: 87 Dołączył: 6.03.2009 Ostrzeżenie: (40%) ![]() ![]() |
|
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 590 Pomógł: 107 Dołączył: 25.10.2011 Ostrzeżenie: (0%) ![]() ![]() |
Co jest złego w podejściu polegającym na korzystaniu z przetestowanego softu? Generalnie to nic. "Problemem" (choć może to nie problem, ale chwilowo brakuje mi słowa, by to poprawnie nazwać) jest to, że namawiasz do użycia Validate pomimo tego, że: 1. nie wiesz, czy w danym oprogramowaniu (Jo-Jo napisał o "specjalistycznym CMSie") Validate się sprawdzi 2. Validate to jednak nadal beta. Zawiera błędy niepoprawione od ponad dwóch lat: http://pear.php.net/bugs/bug.php?id=16897 3. dla mnie z całego pakietu Validate jedyne sensowne testy to testy IBAN i testy na poprawność emaila (choć i tu są błędy) Nie twierdzę, że zrobiłbym to lepiej. Nie twierdzę, że te błędy są krytyczne (choć w oprogramowaniu OpenSource taki czas reakcji... kłuje w oczy). Dla mnie najistotniejsze jest, że raczej tego nie będę potrzebował. I jestem dość mocno przekonany, że Jo-Jo też nie. P.S. Ja kończę tę dyskusję, za bardzo odbiegła od sedna i w zasadzie wszystko już powiedziałem. |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 1 233 Pomógł: 87 Dołączył: 6.03.2009 Ostrzeżenie: (40%) ![]() ![]() |
1. nie wiesz, czy w danym oprogramowaniu (Jo-Jo napisał o "specjalistycznym CMSie") Validate się sprawdzi PEAR:Validate to dobre miejsce do poszukiwania odpowiedzi na pytanie jak powinna wyglądać walidacja. 2. Validate to jednak nadal beta. Zawiera błędy niepoprawione od ponad dwóch lat: http://pear.php.net/bugs/bug.php?id=16897 Jak dla mnie to problem opisywany w tym tickecie nie jest bugiem. Kwestia gustu. 10 lat developowania i nadal wersja beta, świadczy to o ostrożności autora i potwierdza moją tezę, mianowicie nie da w któtkim czasie stworzyć stabilnego sofu i o ile jest możliwość trzeba sięgać do sprawdzonych rozwiązań. Zbór bibltiek PEAR to prowdopodobnie najlepiej sprawdzone i przetestowanie oprogramowanie PHP jakie tylko istnieje. 3. dla mnie z całego pakietu Validate jedyne sensowne testy to testy IBAN i testy na poprawność emaila (choć i tu są błędy) Patrz wyżej. |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 3 Pomógł: 0 Dołączył: 31.07.2012 Ostrzeżenie: (0%) ![]() ![]() |
Wywołałem chyba małą wojnę (IMG:style_emoticons/default/smile.gif)
napisałem sobie taką klasę wątpię żeby byłą idealnie ale zasadniczo rzecz biorąc to co przetestowałem to działa (IMG:style_emoticons/default/smile.gif)
|
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 1 233 Pomógł: 87 Dołączył: 6.03.2009 Ostrzeżenie: (40%) ![]() ![]() |
Ja wysiadam.
Skrypty muszą być odporne na zmiane kodowania, nie mogą zawierać polskich znaków! Tylko ASCII. |
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 590 Pomógł: 107 Dołączył: 25.10.2011 Ostrzeżenie: (0%) ![]() ![]() |
Wywołałem chyba małą wojnę (IMG:style_emoticons/default/smile.gif) Etam "wojnę". Po prostu mała różnica zdań (IMG:style_emoticons/default/smile.gif) @wNogachSpisz już jedną rzecz napisał, ja dołożę kilka uwag: 1. funkcja number zwróci fałsz dla liczb ujemnych i ułamkowych - to zgodne z Twoimi założeniami? 2. funkcja price zadziała TYLKO dla przecinka "," jako separatora części całkowitej i ułamkowej. Tak miało być? 3. funkcja email wyłoży się na adresach mailowych z wielkimi literami (a taki adres jest całkowicie poprawny). Ponadto tłucze mi się po łbie (ale uciąć sobie go nie dam), że: a) fragment adresu mailowego przed "@" powinien zaczynać się od litery (IMG:style_emoticons/default/cool.gif) domena powinna zaczynać się od litery Tak czy inaczej, jeśli na siłę chcesz wyrażenie regularne, które zweryfikuje adres mailowy, to przeszukaj forum na okoliczność słowa "weryfikacja adresu email" lub podobnych - na pewno był ładny, kilkulinijkowy regexp (IMG:style_emoticons/default/smile.gif) 4. funkcje phone i mobilephone wyglądają mi na identyczne (IMG:style_emoticons/default/smile.gif) I obie wyłożą się zarówno na separowaniu spacją lub myślnikiem (111-111-111), jak i na międzynarodowej notacji telefonicznej: +48 22 111 1111 (ze znakiem plusa) |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 3 Pomógł: 0 Dołączył: 31.07.2012 Ostrzeżenie: (0%) ![]() ![]() |
Cytat 1. funkcja number zwróci fałsz dla liczb ujemnych i ułamkowych - to zgodne z Twoimi założeniami? Nie zwróciłem uwagi ale mimo wszystko liczby i tak zawsze będą dodatnie panuje zmienić na is_numeric() Cytat 2. funkcja price zadziała TYLKO dla przecinka "," jako separatora części całkowitej i ułamkowej. Tak miało być? wydaje mi się że tak będzie lepiej i zawsze będę miał spójne dane w bazie Cytat a) fragment adresu mailowego przed "@" powinien zaczynać się od litery domena powinna zaczynać się od litery planuje poprawić na filter_var($_POST["email"], FILTER_VALIDATE_EMAIL) co do domeny można normlanie rejestrować domeny które mają cyfrę na początku (IMG:style_emoticons/default/smile.gif) Cytat 4. funkcje phone i mobilephone wyglądają mi na identyczne I obie wyłożą się zarówno na separowaniu spacją lub myślnikiem (111-111-111), jak i na międzynarodowej notacji telefonicznej: +48 22 111 1111 (ze znakiem plusa) muszę dopracować Co do kolegi wNogachSpisz geniuszem nie jestem wszystkie rozwiązania jakie znalazłem na walidacje polskich liter właśnie tak wyglądały i o ile kody ASCII liter sobie wyciągnę, to nie wiem jak je zastosować w preg_match Pozdrawiam Ten post edytował Jo-Jo 31.07.2012, 21:25:07 |
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 1 233 Pomógł: 87 Dołączył: 6.03.2009 Ostrzeżenie: (40%) ![]() ![]() |
wszystkie rozwiązania jakie znalazłem na walidacje polskich liter właśnie tak wyglądały Smutne ale prawdziwe. Jakość sniptów produkcji krajowej jest zatrważająca. i o ile kody ASCII liter sobie wyciągnę, to nie wiem jak je zastosować w preg_match Musisz zrobić normalizację UTF-8, a potem już z górki :-] Gotowca nie dam, ale polskie znaki usuwam tym sposobem:
Ten post edytował wNogachSpisz 1.08.2012, 10:33:21 |
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 341 Pomógł: 40 Dołączył: 23.06.2009 Ostrzeżenie: (0%) ![]() ![]() |
tylko jedna korekta do dyskusji
@abort::od kiedy domena musi sie zaczynac od litery?? sprawdz np.: 1.pl , 2.pl itd.. j. |
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 590 Pomógł: 107 Dołączył: 25.10.2011 Ostrzeżenie: (0%) ![]() ![]() |
@abort:(IMG:style_emoticons/default/ohmy.gif) d kiedy domena musi sie zaczynac od litery?? Nie wiem dlaczego mnie zaćmiło, ale faktem jest, że to co napisałem o domenach, nie jest prawdą. Tobie dzięki za naprostowanie a innych przepraszam, jeśli wprowadziłem w błąd. Sorry. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 1.10.2025 - 22:32 |