Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

4 Stron V  < 1 2 3 4 >  
Reply to this topicStart new topic
> Najczęstsze błędy w PHP i antywzorce, Kto zna jakieś fajne :)
Sephirus
post 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 smile.gif

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 smile.gif

@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? smile.gif

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...
Go to the top of the page
+Quote Post
thek
post 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
  1. if(false == $zmienna)

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 wink.gif

@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ą wink.gif
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
Go to the top of the page
+Quote Post
Tuminure
post 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++ tongue.gif

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
Go to the top of the page
+Quote Post
Sephirus
post 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...
Go to the top of the page
+Quote Post
redeemer
post 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)


--------------------
Go to the top of the page
+Quote Post
sowiq
post 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%)
-----


Cytat(Sephirus @ 14.01.2013, 14:59:35 ) *
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 smile.gif

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 informuje ostrzega na bieżąco.

Ten post edytował sowiq 14.01.2013, 15:15:11
Go to the top of the page
+Quote Post
Sephirus
post 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 smile.gif


Czasem żałuję że nie ma przy postach na forum opcji z FB typu: LIKE smile.gif

Ale co do IDE - to ma pomóc a nie zastępować nam rozum smile.gif 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 smile.gif a chodzi przecież o błędy początkujących wink.gif

@thek & @Tuminure tak to rozumiem - priorytet tak ale z zapisem:

  1. $result1 = true AND false; // true <-- TYM
  2. $result2 = true && false; // false
  3. $result3 = false OR true; // false <-- i TYM się nie zgadzam :)
  4. $result4 = false || true; // true


smile.gif

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...
Go to the top of the page
+Quote Post
thek
post 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:
  1. if ($zmienna == 0)

i mamy WTF bo false == 0, co nie zawsze jest tym o co chodziło wink.gif 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 wink.gif
  1. $bestHit = false;
  2. try{
  3. foreach($this->structure AS $main) {
  4. if(null !== $first && $first !== $main['name']) {
  5. continue;
  6. }
  7. foreach($main['childrens'] AS $nested) {
  8. if(is_array($name)) {
  9. if(in_array($name['base'], array_keys($nested['attr']))) {
  10. $this->property = array('main' => $main['name'], 'child' => $nested['name']);
  11. foreach($nested['attr'] AS $attr_name => $attr_data) {
  12. if( array_key_exists('params', $name) && $name['params'] == $attr_data['params'] ) {
  13. return $this;
  14. } else {
  15. $bestHit = true;
  16. }
  17. }
  18. }
  19. } else {
  20. if(in_array($name, array_keys($nested['attr']))) {
  21. $this->property = array('main' => $main['name'], 'child' => $nested['name']);
  22. return $this;
  23. } elseif ($name == $nested['name']) {
  24. $this->property = array('main' => $main['name'], 'child' => $nested['name']);
  25. return $this;
  26. }
  27. }
  28. }
  29. }
  30. if($bestHit) {
  31. return $this;
  32. }
  33. } catch (Exception $e) {
  34. throw tu_wyjatek_okreslony_przeze mnie(); // wiem co może mi rzucić, ale dla pewności łapię zakres Exception, a nie od niego pochodny
  35. }
  36. $this->property = array('main' => '', 'child' => '');
  37. return $this;
I powiedz mi, ile czasu zajęło by Ci zrozumienie co w tym się dzieje, w jakim celu i kiedy oraz co jest zwracane wink.gif 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
Go to the top of the page
+Quote Post
Sephirus
post 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:

  1. if(in_array($name, array_keys($nested['attr']))) {
  2. $this->property = array('main' => $main['name'], 'child' => $nested['name']);
  3. return $this;
  4. } elseif ($name == $nested['name']) {
  5. $this->property = array('main' => $main['name'], 'child' => $nested['name']);
  6. return $this;
  7. }


nasuwa pytanie - czemu nie w jednym warunki i || ? smile.gif (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...
Go to the top of the page
+Quote Post
sowiq
post 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:

  1. $var = 123;
  2.  
  3. function test1()
  4. {
  5. echo $var;
  6. }
  7.  
  8. function test2($var)
  9. {
  10. echo $var;
  11. test1();
  12. }
  13.  
  14. test1(); // wywali Warning
  15. test2(5); // wyświetli 5 a nie 123, po czym wywali Warning


Przykład niby oczywisty, ale już małe w zakłopotanie może wprowadzić niektórych dodanie
  1. global $var;

na początku funkcji test1().
Go to the top of the page
+Quote Post
Tuminure
post 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) wink.gif.

http://codepad.org/KorJrKo7

Ten post edytował Tuminure 14.01.2013, 16:38:03
Go to the top of the page
+Quote Post
Sephirus
post 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 smile.gif


--------------------
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...
Go to the top of the page
+Quote Post
thek
post 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:
  1. for ($i = 0; $i < 10; ++$i) {
  2. echo $i;
  3. }
  4. echo $i;

@sephirus: taki zapis dla czytelności podczas etapu utrzymywania i konserwacji kodu smile.gif Ł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ć wink.gif


--------------------
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
Go to the top of the page
+Quote Post
Pilsener
post 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:
  • niczym nie zabezpieczona rekurencja (tym gorsza, że uzależniona od parametrów z zewnątrz)
  • echowanie czego popadnie prosto z requesta lub tablicy $_SERVER, konstrukcje typu ... where id = $_GET['id'] i tak dalej
  • pobieranie wszystkiego z bazy jak leci albo wrzucanie do sesji jak leci - no bo wygodnie mieć wszystko w sesji, najlepiej całą bazę danych od razu wrzucić sobie do sesji, "by mieć taki kesz"
  • "dziś miejsce na dysku nie jest już problemem" - słyszałem to już x razy po czym po chwili dysk pada bo logujemy do plików pierdów bez liku


A jedne z najbardziej irytujących:
  • jednolita konfiguracja dla każdego środowiska, przez co regularnie commituje ustawienia lokalne albo po update wściekam się, że coś nie działa
  • brak jakichkolwiek komentarzy czy dokumentacji, najczęściej im paskudniejszy kod tym komentarzy jak na złość mniej
  • brak sprawdzania, czy coś się wykonało, założenie, że jak funkcja coś zwraca to z pewnością jest to spam, potem coś po prostu nie działa i sobie możesz szukać kilka dni no bo przecież "funkcja powinna wygenerować warninga chociaż jak jej kiepawo idzie"
  • używanie gdzie popadnie różnych fantastycznych wynalazków cudownego dziecka skryptu typu eval, goto, dynamiczne generowanie zmiennych - ekstrakcja to mały pikuś przy tym
  • obiektowość rozumiana tak, że np. co każde 100 linijek walniemy klasę a co 20 metodę, tworzenie jakiś dziwnych fabryk czy raczej młockarni obiektów które tworzą takie plewy, że człowiek tęskni za dynamicznym generowaniem zmiennych smile.gif
Go to the top of the page
+Quote Post
sowiq
post 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%)
-----


Cytat(thek @ 14.01.2013, 22:13:48 ) *
To co wewnątrz pętli, poza nią też nie istnieje, czyli problem w stylu:
  1. for ($i = 0; $i < 10; ++$i) {
  2. echo $i;
  3. }
  4. echo $i;

Pudło kolego smile.gif 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ć smile.gif Najlepszy kwiatek jaki widziałem (napisany na 99% przez hindusa). Nie trzeba tego chyba komentować wink.gif
  1. eval('$i = ' . $j . ';');


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 smile.gif

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.
  1. $records = $db->getRecords("SELECT * FROM table1");
  2.  
  3. foreach($records as $record)
  4. {
  5. $item = $db->getRecords("SELECT * FROM table2 WHERE category_id = ?", $record['id']);
  6. echo $item['name']; // jakakolwiek operacja
  7. }
  8.  
  9. /** a tutaj jak to powinno wyglądać **/
  10. $records = $db->getRecords("SELECT * FROM table1 t1 JOIN table2 t2 ON t2.category_id = t1.id");
  11.  
  12. foreach($records as $record)
  13. {
  14. echo $item['name']; // jakakolwiek operacja
  15. }
  16.  
  17. /** lub: **/
  18. $records = $db->getRecords("SELECT * FROM table1");
  19. $ids = array();
  20.  
  21. foreach($records as $record)
  22. {
  23. $ids[] = $record['id'];
  24. }
  25.  
  26. $records = $db->getRecords("SELECT * FROM table2 WHERE category_id IN (?)", implode(', ', $ids));
  27.  
  28. foreach($records as $record)
  29. {
  30. echo $item['name']; // jakakolwiek operacja
  31. }


Ten post edytował sowiq 15.01.2013, 09:47:32
Go to the top of the page
+Quote Post
Sephirus
post 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ę" wink.gif

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 smile.gif

Przypomniał mi się tutaj jeden fajny bajer jaki widziałem w kodzie młodego kolegi... i żeby nie było to autentyk smile.gif

  1. // jakieś operacje na PDO itd... środek jakiegoś modelu metoda zwracająca liczbę rek. w tabeli (coś z paginacją o ile pamiętam)
  2.  
  3. // ...
  4. $stmt = $pdo->query('SELECT * FROM tablica ');
  5. $results = $stmt->fetchAll();
  6. return count($results);
  7. // ...
  8.  


wink.gif


--------------------
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...
Go to the top of the page
+Quote Post
thek
post 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
Go to the top of the page
+Quote Post
sowiq
post 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%)
-----


Cytat(thek @ 15.01.2013, 09:16:55 ) *
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.
  1. <img src="/admin/post.php?act=deleteAll&confirmed=1" />

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 smile.gif

[edit]
Cytat(Sephirus @ 15.01.2013, 09:02:05 ) *
Przypomniał mi się tutaj jeden fajny bajer jaki widziałem w kodzie młodego kolegi... i żeby nie było to autentyk smile.gif

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 wink.gif

Ten post edytował sowiq 15.01.2013, 09:44:10
Go to the top of the page
+Quote Post
thek
post 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
Go to the top of the page
+Quote Post
O$iek
post 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ć"? smile.gif
Go to the top of the page
+Quote Post

4 Stron V  < 1 2 3 4 >
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: 28.04.2024 - 07:23