Najczęstsze błędy w PHP i antywzorce, Kto zna jakieś fajne :) |
Najczęstsze błędy w PHP i antywzorce, Kto zna jakieś fajne :) |
14.01.2013, 14:46:42
Post
#21
|
|
Grupa: Zarejestrowani Postów: 1 527 Pomógł: 438 Dołączył: 28.06.2011 Skąd: Warszawa Ostrzeżenie: (0%) |
Zgadzam się w 100%, niestety z takimi starymi bytami nie ma szans na poprawę - przyczyna jest prosta - albo brak "zasobów" by to zrobić - albo prosta, czysta "nieopłacalnośc" - jednak ktoś płaci za czas pracy programistów
Zresztą po przeczytaniu Twojego nospor arta, umocniłem się jedynie w przekonaniu, że samo generowanie tych błędów zajmuje czas, toteż ich ukrywanie w dużej liczbie jedzie po wydajności - mnie to przekonuje do kwadratu @Tuminure ok może coś źle rozumiem ale nie widzę róznicy w PHP między AND a && i OR a ||? Widzę jedynie pomiędzy AND/&& a & i odpowiednio OR/|| a | Na pewno tak jest? Ten post edytował Sephirus 14.01.2013, 14:55:30 -------------------- If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;) Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka... |
|
|
14.01.2013, 14:56:41
Post
#22
|
|
Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D |
Ja przykładowo dzięki przeglądaniu kodów innych, przekonałem sie do "inwersji" w warunkach, czyli
która w razie czego zareaguje, gdyby mi się zamiast == wpisało samo =, co w debugu może przejść niezauważone. Co do takich bardziej typowych błędów spotykanych, to oczywiście wszelkiego rodzaju gubienie się w zasięgu zmiennych spowodowane choćby używaniem globali lub zmiennych statycznych, których jednak część ludzi nie rozumie (inna sprawa, że global to zuo straszne). Często problemy z zapomnianym session_start. Chyba sztandarowy problem z wysyłaniem headersów przed funkcjami pokroju set_cookies wynikający albo z walnięcia entera przed <?php , czy zapisu strony ze znacznikiem BOM @Sephirus: Chodzi o priorytet operacji. && i || mają pierwszeństwo przed AND i OR, co może mieć odbicie w operacjach logicznych, gdy ktoś pomiesza oba rodzaje ze sobą
Powód edycji: @Operatory logiczne
-------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
14.01.2013, 14:58:37
Post
#23
|
|
Grupa: Zarejestrowani Postów: 178 Pomógł: 49 Dołączył: 16.04.2012 Skąd: Bytom Ostrzeżenie: (0%) |
Cytat 2+3*4 nie jest równe 20 Aż mi się przypomniało przeładowywanie operatorów z artykułu nonsensopedii dot. C++ Do tego tematu w gruncie rzeczy pasuje też ten link: http://nonsensopedia.wikia.com/wiki/PHP Cytat ok może coś źle rozumiem ale nie widzę róznicy w PHP między AND a && i OR a ||? Widzę jedynie pomiędzy AND/&& a & i odpowiednio OR/|| a | Po prawej stronie podałem wyniki, które wskazałby var_dump na podanej zmiennej. W podanym przez Ciebie linku w Example #1, również jest to co podałem. Ten post edytował Tuminure 14.01.2013, 15:07:17 |
|
|
14.01.2013, 14:59:35
Post
#24
|
|
Grupa: Zarejestrowani Postów: 1 527 Pomógł: 438 Dołączył: 28.06.2011 Skąd: Warszawa Ostrzeżenie: (0%) |
@thek Tak ta "inwersja" jeśli chodzi o kolejność jest fajną sprawą i choć sam nie stosowałem - przekonałem się właśnie do tego.
Co do globali to mi się skojarzyło z register_globals od razu, choć jest to już temat może archaiczny to mimo wszystko nadal się go sporadycznie spotyka :| A już użycie funkcji extract aby go symulować bez żadnych zabezpieczeń i kontroli tego co przychodzi chociażby z GETów to już cofanie się w rozwoju a też to spotykam :/ EDIT: Właśnie znalazłem jeszcze jeden częsty błąd... Trzeba pamiętać by czyścić monitor :/ Właśnie kombinowałem czemu godzina pokazuje mi się jako 15;02 a nie 15:02 hmm... po znalezieniu odpowiedniej linijki, sprawdzeniu, i poruszeniu rolki myszki okazało się że to paproch :/ Ten post edytował Sephirus 14.01.2013, 15:04:33 -------------------- If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;) Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka... |
|
|
14.01.2013, 15:08:49
Post
#25
|
|
Grupa: Zarejestrowani Postów: 915 Pomógł: 210 Dołączył: 8.09.2009 Skąd: Tomaszów Lubelski/Wrocław Ostrzeżenie: (0%) |
W większości wypadków jako operator porównania lepiej stosować === zamiast == (http://gynvael.coldwind.pl/?id=492)
-------------------- |
|
|
14.01.2013, 15:10:13
Post
#26
|
|
Grupa: Zarejestrowani Postów: 1 890 Pomógł: 339 Dołączył: 14.12.2006 Skąd: Warszawa Ostrzeżenie: (0%) |
A już użycie funkcji extract... Mój kolega powiedział kiedyś bardzo trafne porównanie - funkcja extract to rozrzutnik gnoju. I tyle w tym temacie A po kilku postach, które przejrzałem - zapomniane session_start, jakieś headery, zasięg zmiennych, pomylone = i ==... Kurde, ludzie, czy Wy dalej piszecie strukturalne PHP w Notatniku? O sesjach czy headerach zapomniałem w chwili kiedy pierwszy raz użyłem frameworka. Zasięg zmiennych? Może za czasów pisania strukturalnych skryptów, ale nie programowania w OOP. A o pomyłkach = / == każde średnio zaawansowane IDE Ten post edytował sowiq 14.01.2013, 15:15:11 |
|
|
14.01.2013, 15:16:10
Post
#27
|
|
Grupa: Zarejestrowani Postów: 1 527 Pomógł: 438 Dołączył: 28.06.2011 Skąd: Warszawa Ostrzeżenie: (0%) |
Cytat Mój kolega powiedział kiedyś bardzo trafne porównanie - funkcja extract to rozrzutnik gnoju. I tyle w tym temacie Czasem żałuję że nie ma przy postach na forum opcji z FB typu: LIKE Ale co do IDE - to ma pomóc a nie zastępować nam rozum Dla doświadczonego programisty dobre IDE to skarb, nie dlatego że poprawia kod, ale że podpowiada i daje dużo przydatnych funkcjonalności. Jak ktoś jednak chcę się "nauczyć" programować to chyba jednak coś pokroju notatnik-plus byłby lepszy a chodzi przecież o błędy początkujących @thek & @Tuminure tak to rozumiem - priorytet tak ale z zapisem:
Ten post edytował Sephirus 14.01.2013, 15:22:34 -------------------- If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;) Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka... |
|
|
14.01.2013, 16:00:27
Post
#28
|
|
Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D |
@sowIq: co innego gdy korzystasz z Fw, a co innego gdy sam się zabrałeś za pisanie czegoś z celowym jego pominięciem, by narzut czasowy zlikwidować w ramach optymalizacji wąskich gardeł aplikacji.
Poza tym wiele osób nie zwraca uwagi, że funkcje php mogą zwrócić w normalnym trybie jako prawidłowy wynik 0 czy false, zaś jako nieprawidłowy null, a inne z kolei zwracają jako prawidłowe 0 i false, ale już nie null. Brak po prostu jednoznacznego określenia co jest prawidłowe, a co nie w tym języku. Wtedy:
i mamy WTF bo false == 0, co nie zawsze jest tym o co chodziło Pisząc od początku w jakimś Fw o wielu takich rzeczach się nie wie i nie myśli. Potem nadchodzi zmiana Fw i jest kaplica. Headery? Nadal są gdy ktoś zapisze plik w UTF-8, ale nie zwróci uwagi jakim (stąd uwaga o BOM) albo przed <?php zdarzy mu się enter. Takich rzeczy Fw nie wyłapie. Zasięg zmiennych? Nie każdy kod ma 5 linijek... Czasami metody z racji takich, a nie innych sytuacji mają ogromną złożoność i zdarza się, że w 5-6 zagnieżdżeniu ( niekoniecznie pętli, ale i struktury warunkowej) można się już na tym naciąć. Przykład Ci krótki dam, gdyż jakiś czas temu sobie skrobnąłem. Metoda ma znaczne complexity, ponieważ dane do niej przychodzące i obrabiane mogą być tablicą, ale i stringiem. Z kolei inny parametr może być raz stringiem, ale innym razem nullem I powiedz mi, ile czasu zajęło by Ci zrozumienie co w tym się dzieje, w jakim celu i kiedy oraz co jest zwracane Nie jest to kwestia sporzenia przez moment, a to tylko 30 linijek, będących całym ciałem jednej metody. Complexity tego kodu jest naprawdę duże, ale wynika ze struktury danych oraz danych wejściowych dla tej metody. Z tego nie wytniesz nawet linijki do metody prywatnej czy nie zrobisz klasy pomocniczej, która by to uprościła. Weź się walnij z returnem, miejscem inicjalizacji $bestHit lub przypisaniem danych do niej i masz problem z zasięgiem. A popatrz jak wiele miejsc ma ta metoda, by się pomylić, choć to tylko 2 zagnieżdżone foreach, tyle że ifów jest tu niestety wiele. I tak... Metoda ma napisany test, który ją całkowicie pokrywa, więc w razie czego wyłapię problem. -------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
14.01.2013, 16:10:56
Post
#29
|
|
Grupa: Zarejestrowani Postów: 1 527 Pomógł: 438 Dołączył: 28.06.2011 Skąd: Warszawa Ostrzeżenie: (0%) |
W sumie popieram przedmówcę ale (za pewne to babol jakiś) kod:
nasuwa pytanie - czemu nie w jednym warunki i || ? (wiem czepiam się) -------------------- If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;) Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka... |
|
|
14.01.2013, 16:14:57
Post
#30
|
|
Grupa: Zarejestrowani Postów: 1 890 Pomógł: 339 Dołączył: 14.12.2006 Skąd: Warszawa Ostrzeżenie: (0%) |
@thek, a co ma zasięg zmiennych do ilości i zagnieżdżenia pętli oraz złożoności kodu? Do rozwiązania ewentualnych problemów z tym związanych są - jak słusznie napisałeś - testy.
A problem z zasięgiem zmiennych bardziej kojarzy mi się z takim kodem:
Przykład niby oczywisty, ale już małe w zakłopotanie może wprowadzić niektórych dodanie na początku funkcji test1(). |
|
|
14.01.2013, 16:34:12
Post
#31
|
|
Grupa: Zarejestrowani Postów: 178 Pomógł: 49 Dołączył: 16.04.2012 Skąd: Bytom Ostrzeżenie: (0%) |
Wychodziłem akurat z pracy, więc nie dokończyłem poprzedniego komentarza...
Cytat @thek & @Tuminure tak to rozumiem - priorytet tak ale z zapisem: Sęk w tym, że operator = jest wykonywany przed operatorem AND, a po operatorze &&. Analogiczna sytuacja występuje przy OR i ||. W komentarzach umieściłem wersję z nawiasami, która powinna wyjaśnić w czym tkwi różnica. W podanym przez Ciebie linku również jest to wytłumaczone w komentarzach (w Example#1) . http://codepad.org/KorJrKo7 Ten post edytował Tuminure 14.01.2013, 16:38:03 |
|
|
14.01.2013, 16:46:15
Post
#32
|
|
Grupa: Zarejestrowani Postów: 1 527 Pomógł: 438 Dołączył: 28.06.2011 Skąd: Warszawa Ostrzeżenie: (0%) |
Facepalm. ok @Tuminure masz całkowitą rację, od zupełnie innej strony do tego podszedłem
-------------------- If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;) Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka... |
|
|
14.01.2013, 22:13:48
Post
#33
|
|
Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D |
@sowiq: Przy złożonym kodzie bardzo łatwo się pogubić ze zmiennymi i tym co gdzie oraz jak inicjalizujemy, nadpisujemy lub zwracamy. Zauważ, że mógłbym przykładowo gdzieś w pętli zrobić break i mieć zmienną nadpisującą wewnątrz pętli inną, o zasięgu większym. Gdy takie sytuacje występują, bardzo łatwo się w tym pomylić. Pamiętajmy, że zasięg zmiennej to nie tylko zakres widoczności wnętrza funkcji, ale także przykładowo wnętrza pętli. To co wewnątrz pętli, poza nią też nie istnieje, czyli problem w stylu:
@sephirus: taki zapis dla czytelności podczas etapu utrzymywania i konserwacji kodu Łatwiej zauważyć innym, że raz mamy do czynienia ze stringiem, a innym razem z tablicą. Choć jak sam zauważyłeś, można to zbić do jednego, ale długość tego warunku przekroczyła by nie tylko sztywny limit 80 znaków, ale także miękki 120, a ja z racji czytelności staram się warunków nie "łamać" do następnej linii, choć na owo łamanie standardy pozwalają. No i narzędzia typu Sonar trochę potrafią Ci w kodzie potencjalnych pułapek wskazać -------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
14.01.2013, 23:09:36
Post
#34
|
|
Grupa: Zarejestrowani Postów: 1 590 Pomógł: 185 Dołączył: 19.04.2006 Skąd: Gdańsk Ostrzeżenie: (0%) |
Najgorsze są dla mnie błędy związane z wydajnością i bezpieczeństwem, typu:
A jedne z najbardziej irytujących:
|
|
|
14.01.2013, 23:21:42
Post
#35
|
|
Grupa: Zarejestrowani Postów: 1 890 Pomógł: 339 Dołączył: 14.12.2006 Skąd: Warszawa Ostrzeżenie: (0%) |
To co wewnątrz pętli, poza nią też nie istnieje, czyli problem w stylu:
Pudło kolego Nie ten język. Za pętlą $i będzie miało wartość 10. [edit] Niektórzy mieli okazję pracować nad hinduskim kodem i im nie trzeba tłumaczyć Najlepszy kwiatek jaki widziałem (napisany na 99% przez hindusa). Nie trzeba tego chyba komentować Inna rzecz, jaka mnie wprawiła w zdumienie to jakiś portal społecznościowy z prywatnymi wiadomościami, do których można dodawać załączniki. Brak jakiejkolwiek walidacji sprawiał, że po załączeniu przez nadawcę pliku PHP, odbiorca zamiast go pobierać, wykonywał go na serwerze No i oczywiście temat rzeka - XSS. Należy pamiętać, że na modyfikację danych (dodawanie, usuwanie, update) należy pozawalać tylko requestom wykonywanym metodą POST. [edit 2] Jeśli chodzi o antywzorce, to znam jeden, który sam kiedyś z lubością (a raczej bez refleksji) praktykowałem. A chodzi o uzależnianie ilości wykonywanych zapytań SQL od ilości rekordów w bazie. Jak widać poniżej - im więcej rekordów będzie miała tabelka table1, tym więcej zapytań zostanie wykonanych na tabelce table2. Problem jest niezauważalny podczas przeklikiwania się przez aplikację z 10, 20, 50 rekordami w bazie. Ale problem może się zacząć pojawiać na serwerze produkcyjnym z dużo większą ilością danych.
Ten post edytował sowiq 15.01.2013, 09:47:32 |
|
|
15.01.2013, 09:02:05
Post
#36
|
|
Grupa: Zarejestrowani Postów: 1 527 Pomógł: 438 Dołączył: 28.06.2011 Skąd: Warszawa Ostrzeżenie: (0%) |
@thek Rozumiem - ma to duży sens bo kod jest faktycznie bardziej czytelny, ja w tych miejscach jednak łamię warunki ;P stąd moje "czepianie się"
Co do tej pętli to faktycznie sowiq ma rację - sam często wykorzystuję fakt, że w PHP zmienna użyta w pętli, po jej zakończeniu służy jeszcze do czegoś (dla jej ostatniej wartości). @sowiq Oj tak - ten antywzorzec z liczbą zapytań, już tu zresztą wspominany, to naprawdę zmora niedoświadczonych z dużymi serwisami produkcyjnymi programistów, wszystko śmiga a potem na produkcji zaczyna się kombinowanie co jest nie tak że przymula Przypomniał mi się tutaj jeden fajny bajer jaki widziałem w kodzie młodego kolegi... i żeby nie było to autentyk
-------------------- If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;) Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka... |
|
|
15.01.2013, 09:16:55
Post
#37
|
|
Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D |
@sowiq: w PHP to przejdzie, bo język ten ma swoje głupotki. W większości języków jednak zapis ten wywinie orła. Pisząc zaś o antywzorcach i błędach można wyjść poza jezyk, wskazując jego usterki, nielogiczności - w odniesieniu do innych znanych sobie języków. Bo niestety, ale język ten ma swoje upierdliwości, które widać patrząc z perspektywy innych. I nie chodzi mi o wydajność czy tego typu rzeczy, ale właśnie nielogiczność pewnych konstrukcji, struktur czy funkcji. Wspomniana niejednoznaczność wyniku funkcji, brak konsekwencji w kolejności parametrów (niektóre funkcje można wywołać raz tak, raz siak) czy problemy z zasięgiem zmiennych lokalnych (właśnie dlatego wspomniany) to przecież nie jedyne, które mogą wkurzać.
Co do zezwalania na modyfikacje tylko danym POST, to co to za różnica? Dane jedynie minimalnie trudniej spreparować. Po prostu nie możemy na pałę w linku podmienić parametru. Ale firebug, tamperdata lub podobne i zero problemów. To jest bardziej zalecenie projektowe. -------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
15.01.2013, 09:39:11
Post
#38
|
|
Grupa: Zarejestrowani Postów: 1 890 Pomógł: 339 Dołączył: 14.12.2006 Skąd: Warszawa Ostrzeżenie: (0%) |
Co do zezwalania na modyfikacje tylko danym POST, to co to za różnica? Dane jedynie minimalnie trudniej spreparować. Po prostu nie możemy na pałę w linku podmienić parametru. Ale firebug, tamperdata lub podobne i zero problemów. To jest bardziej zalecenie projektowe. Oczywiście, że to zalecenie projektowe, nikt Ci przecież nie każe na siłę tak robić. Ale jest to zalecenie dotyczące bezpieczeństwa. I nie chodzi tu o to, że "atakującemu" będzie trudniej wysłać takie zapytanie, bo to akurat pryszcz. Chodzi o XSS, o którym wspomniałem wcześniej. Jak na Twojej stornie masz jakąś dziurę pozwalającą na XSS, której nie zauważyłeś i ktoś doda Ci taki obrazek jak poniżej, to masz mały problem.
Chodzi o to, że zapytania POST nie da się wygenerować za pomocą prostego XSS. Musiałaby to być mega dziura pozwalająca na dodanie JS [edit] Przypomniał mi się tutaj jeden fajny bajer jaki widziałem w kodzie młodego kolegi... i żeby nie było to autentyk Kiedyś pracowałem przy rozbudowie jednego z większych portali obrazkowych w USA i widziałem identyczny kwiatek. Więc to nie jest domena tylko tych młodszych programistów i tylko tych mniejszych projektów Ten post edytował sowiq 15.01.2013, 09:44:10 |
|
|
15.01.2013, 13:14:20
Post
#39
|
|
Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D |
W przypadku XSS czy nie, zawsze się userowi robi "sandboxa", o czym wiele osób zapomina. Pozwalasz na jakieś akcje? Ogranicz to uprawnieniami tak mocno jak sie da. Taka przykladowa deletAll, nawet gdyby zadziałała, rąbnęła by nie całość bazy, ale maksymalnie to, do czego uprawnienia ma dany user. Niestety ten aspekt wielu ludzi "gubi" w czasie pisania aplikacji. Robią akcje napisane, mają uprawnienia, ale zapominają obie te rzeczy powiązać. To jest jeden z dość częstych błędów: brak lub szczątkowe zabezpieczenia na różnych poziomach.
Kwiatki takiego pokroju sam widziałem. Takie, gdzie z powodu braku spostrzegawczości potrafiło w czasie ładowania strony zahydrować przez Doctrine2 całą bazę - także. -------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
15.01.2013, 13:59:01
Post
#40
|
|
Grupa: Nieautoryzowani Postów: 45 Pomógł: 16 Dołączył: 28.02.2009 Ostrzeżenie: (0%) |
Co to znaczy "hydrować"?
|
|
|
Wersja Lo-Fi | Aktualny czas: 28.04.2024 - 07:23 |