Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Bezpieczeństwo zmiennej GET
Ulysess
post
Post #1





Grupa: Zarejestrowani
Postów: 695
Pomógł: 65
Dołączył: 27.07.2009
Skąd: Y

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


dzień dobry z góry mówię szukałem poprzez szukaj i nie znalazłem..
mam takie pytanie jakich funkcji użyć aby zabezpieczyć zawartość zmiennej tzn żeby nie było możliwe wykonanie jakiego kolwiek zapytania , złośliwego kodu.
w zmiennej get A oraz B mogą znajdować się tylko i wyłącznie liczby dodatnie. czy użycie is_numeric jest wystarczające (IMG:style_emoticons/default/questionmark.gif)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
thek
post
Post #2





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Wszystko ładnie, pięknie, ale przez GET lecą także stringi a nie tylko int. Rozumiem, że w tym temacie akurat o INT chodzi, bo tak autor zadeklarował. Ja sądzę, że najpierw powinno być sprawdzenie czy zmienna jest w ogóle ustawiona (isset), potem sprawdzenie czy zmienna jest liczbą (is_numeric), a na sam koniec czy jest większa od 0. A dlaczego tak i w tej kolejności? To proste. w warunku IF php sprawdza zależności po kolei i w przypadku gdy wszędzie są AND przerwie sprawdzanie na pierwszym FALSE nie kończąc i idąc dalej. Wynika to z algebry Boole'a, gdyż tylko TRUE na wszystkich pozycjach daje TRUE. Wystarczy choć jeden FALSE i automatycznie całe wyrażenie jest FALSE. Dlatego powinno się te najbardziej istotne ustawiać na samym początku by warunki były jak najbardziej optymalne.
  1. if(isset($_GET['A']) && is_numeric($_GET['A']) && $_GET['A'] > 0 && isset($_GET['B']) && is_numeric($_GET['B']) && $_GET['B'] > 0 )

Może się w takim przypadku zdarzyć, że jeśli A nie będzie liczbą, to IF zwróci FALSE już przy drugim fragmencie i reszty nawet nie sprawdzi, wychodząc z warunku. To jest optymalizacja w IFie dla szybszego działania.
Inna sprawa to kolejność w jakiej sprawdzam. Dlaczego taką przyjąłem? To proste. Zmienna musi być i to chyba jasne dlaczego isset jest pierwsze. A dlaczego is_numeric jest drugie? Bo jeśli ktoś do zmiennej A wpisze c, t lub jakąkolwiek literę to $_GET['A'] zwróci TRUE. Wynika to z tego, że PHP niejawnie skonwertuje znak do odpowiadającego mu kodu ASCII i zwróci znak jako liczbę typu INT zawsze dodatnią, bo nie ma ujemnych znaków ASCII. A przecież to jest jawny błąd. Stąd sprawdzanie czy zmienna jest liczbą musi być wykonane wcześniej niż sprawdzenie większości od 0.
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 13.10.2025 - 07:03