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 (1 - 14)
Crozin
post
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Możesz sprawdzić przy pomocy is_numeric, ctype_digit albo IMO najlepiej rzutować to na typ całkowity ((int) $abc), a następnie sprawdzić czy 0 < $abc < LIMIT_GÓRNY
Go to the top of the page
+Quote Post
wookieb
post
Post #3





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Cytat(Rookie @ 30.08.2009, 13:01:34 ) *
... Jest tylko jeden, z którego jakoś nie zrozumiałem za wiele.
Jak masz pomagać w taki sposób to po co się wgl za to bierzesz??
Szkoda, że na tym forum nie ma "rep -" albo "nie pomógł" albo jeszcze coś w tym stylu ...


http://php.net/is_numeric
http://php.net/abs
http://forum.php.pl/index.php?showtopic=30...stwo+skrypt%F3w
Go to the top of the page
+Quote Post
Ulysess
post
Post #4





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

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


if(is_numeric(abs($_GET[a'])) && (is_numeric(abs($_GET['b']))))

próbowałem użyć abs ale to chyba nie przejdzie no chyba że w warunku nie zadziała
Go to the top of the page
+Quote Post
daniel1302
post
Post #5





Grupa: Zarejestrowani
Postów: 602
Pomógł: 30
Dołączył: 1.08.2007
Skąd: Nowy Sącz

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


Tak, ja zawszę stosuje ctype_digit() ale ona rozpoznaje 0 jako false; ale is_numeric w zupełności wystarczy aby sprawdzić czy to jest liczba

if ($A < 0 && is_numeric($A))
{
}
Go to the top of the page
+Quote Post
Ulysess
post
Post #6





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

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


Cytat(daniel1302 @ 30.08.2009, 13:37:16 ) *
Tak, ja zawszę stosuje ctype_digit() ale ona rozpoznaje 0 jako false; ale is_numeric w zupełności wystarczy aby sprawdzić czy to jest liczba

if ($A < 0 && is_numeric($A))
{
}

jeżeli w zmiennej dodasz minus też będzie akceptować więc nie za bardzo wysatrczy no chyba że po sprawdzeniu is numeric użyje ABS no to oki. przynajmniej tak mi się wydaje


ajc dopiero teraz zobaczyłem że uzywałeś czy jest wieksze od 0 sorki . hmm a nie lepiej tak jak ja powiedziałem hmm tylko is numeric a poźniej na wszelki wypadek abs ?
Go to the top of the page
+Quote Post
thek
post
Post #7





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
Crozin
post
Post #8





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Użycie is_numeric z reguły nie jest najlepszym rozwiązaniem - w końcu przepuszcza ono liczby w formacie wykładniczym, liczby zmiennoprzecinkowe jak i całkowite.
  1. <?
  2. $myVar = isset($_GET['myVar']) ? (int) /* albo (float) */ $_GET['myVar'] : 0;
  3. if($myVar <= 0 || $myVar > 123456){
  4. die('Invalid value');
  5. }
Dodatkowo taka zmienna ($myVar) jest już oczyszczona, tj. pozbawiona jest jakiś nadmiarowych plusów czy spacji.
Go to the top of the page
+Quote Post
Ulysess
post
Post #9





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

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


ja to napisałem tak:
sprawdzam czy $a i $b jest pusta -> !empty
jeśli nie to sprawdza czy jest liczba - is_numeric
jeśli to to przepuści robie $a = abs($_GET['a'])

i dalej wykonanie dalszego skryptu. rozsądnie (IMG:style_emoticons/default/questionmark.gif)
Go to the top of the page
+Quote Post
thek
post
Post #10





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




Cytat(Crozin @ 30.08.2009, 14:52:54 ) *
Użycie is_numeric z reguły nie jest najlepszym rozwiązaniem - w końcu przepuszcza ono liczby w formacie wykładniczym, liczby zmiennoprzecinkowe jak i całkowite.
Prawda... Ale my sprawdzamy czy jest to liczba. Nie było napisane w pytaniu czy jest to liczba naturalna czy zmiennoprzecinkowa.Ja użyłem is_numeric by wyeliminować konwersję znaków do ich adpowiedników ASCII. I z tego ta funkcja się wywiązuje prawidłowo (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Fafu
post
Post #11





Grupa: Zarejestrowani
Postów: 243
Pomógł: 33
Dołączył: 30.01.2008
Skąd: Wrocław

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


IMO używanie
  1. $id = (int)$_GET['id'];

jest całkowicie wystarczające...
Go to the top of the page
+Quote Post
bełdzio
post
Post #12





Grupa: Zarejestrowani
Postów: 690
Pomógł: 81
Dołączył: 6.04.2005
Skąd: Szczecin

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


możesz też użyć wbudowanych filtrów, które w pełni spełnią Twoje wymogi => http://www.beldzio.com/phpowe-filtry
Go to the top of the page
+Quote Post
pyro
post
Post #13





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

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


A jak nie filtr (np. wersja PHP starsza od 5.2.0) to wystarczy w zupełności rzutowanie typu + abs(). Jeżeli jednak chcesz sprawdzić, czy zmienna jest liczbowa (z GET) to np. można w ten sposób (samo is_int() nie wystarczy ze względu na to, że zmienne z ów tablic superglobalnych są stringami, przez co zwróci zawsze false).

  1. function is_string_integer($string)
  2. {
  3. return preg_match('|^[0-9]+$|', $string) ? true : false;
  4. }
Go to the top of the page
+Quote Post
Crozin
post
Post #14





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


@pyro: pomijając to, że nie ma potrzeby dawania "? true : false", to... do czegoś takiego wyrażenia regularne? Przecież do sprawdzenia czy jest to liczba całkowita wystarczy ctype_digit() czy (int) $a == $a ? true : false;
Go to the top of the page
+Quote Post
pyro
post
Post #15





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

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


Cytat(Crozin @ 30.08.2009, 21:01:18 ) *
@pyro: pomijając to, że nie ma potrzeby dawania "? true : false


preg_match zwraca false w przypadku błędu lub liczbę 1/0 jeśli znalazł/nie znalazł podanego wyrażenia. Ja po prostu dla wygody stosuje bool.

Cytat(Crozin @ 30.08.2009, 21:01:18 ) *
Przecież do sprawdzenia czy jest to liczba całkowita wystarczy ctype_digit()


Właśnie to chciałem napisać, ale odwróciłem się na chwilę do telewizora, obróciłem z powrotem i zapomniałem co miałem napisać (IMG:style_emoticons/default/biggrin.gif) :D:D

Ten post edytował pyro 30.08.2009, 20:16:20
Go to the top of the page
+Quote Post

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: 23.08.2025 - 06:52