piotr485
8.12.2012, 22:33:07
Witam.
Pobierając dane poprzez mysql_fetch_assoc zapytaniem:
mysql_query('SELECT * FROM tabela where id = "5"') or die(mysql_error);
Pole id 5 jest pobierane poprzez $_GET
Jeśli go nie przefiltruje to jest jakieś niebezpieczeństwo takie, że po wpisaniu jakiś poleceń zamiast "5" może zapytanie przerobić się w update albo delete ?
Jak to wygląda ?
markonix
9.12.2012, 11:10:26
markonix
9.12.2012, 18:14:50
Cytat(Daimon93 @ 9.12.2012, 18:10:22 )

Czyżby nabiajnie postów? kolega chciał dowiedzieć się jak to może wyglądać.
Wpisze sobie w Google to znajdzie setki przykładów jak to wygląda...
Nie trzeba każdemu tłumaczyć od nowa..
Poza tym Twoja wypowiedź jest daleka od prawdy.
mysql_query('SELECT * FROM tabela where id = '. (int
)$_GET['id']);
Nie filtrowałem GET - shakuj mnie.
viking
9.12.2012, 18:23:09
Wystarczy jakiś błąd w PHP (a w przeszłości już różne kwiatki działy się z liczbami) i leżysz.
wizarts
10.12.2012, 12:21:50
Najpierw sprawdź czy przesłany identyfikator spełnia założenia ( np.: przez wyrażenia regularne, a w przypadku wartości liczbowej np.: przez funckję
), następnie sprawdź czy w bazie danych występuje rekord dla podanego identyfikatora ( np.: przez SELECT count(*) ), gdy wartość będzie spełniała kryteria dopiero pobierz dane z bazy. Dodatkowo, możesz zweryfikować czy użytkownik uruchamiający zapytanie ma odpowiednie uprawnienia w bazie danych ( o ile wogóle w niej wystepuje ).
markonix
10.12.2012, 13:36:12
wizarts niepotrzebne kroki. Po co walidacja is_numeric?
PDO bądź coś zbliżonego co zabezpiecza nas przed takimi problemami.
I tyle. Haker zmienia ID na string, wykonuje się zapytanie, nie znajduje artykułu, nic się nie dzieje.
Wyświetlasz "Nie ma artykułu" i to wystarczy w zupełności.
Po co wyświetlać "Wpisane ID nie jest numeryczne", "Podany string nie spełnia założeń wyrażenia regularnego"?
Potem po co dwa zapytania do pobrania artykułu? Pobierasz jeden wiersz po indeksie ID czyli bardzo lekkie zapytanie.
Pobierasz, sprawdzasz czy pobrało wiersz i jeśli masz tablicę/obiekt to już nie musisz wykonywać kolejnego zapytania.
wizarts
10.12.2012, 14:17:45
Miałem na myśli jedną metodę walidacji, czyli gdy spodziewam się, że identyfikator ma być liczbą sprawdzam go funkcją is_numeric bądź wyrażeniem regularnym, a w przypadku, gdy identyfikator jest stringiem sprawdzam przy pomocy regular expressions.
Powyższe sprawdzenie wykonuje bez informowania użytkownika o tym czy wartość przeszła walidację czy nie wyświetlając jedynie ostateczny komunikat, że nie znaleziono artykułu.
Dwa zapytania właśnie poto, żeby w przypadku wartości nieliczbowej uniemożliwić sql_injection.
SELECT count(*) nieznacznie obciąża bazę, więc aplikacja ponosi niewielki koszt wydajności w porównaniu do zwiększenia bezpieczeństwa.
markonix
10.12.2012, 14:25:10
Nigdzie nie widziałem w poważnej aplikacji aby przy każdym pobieraniu danych z POST/GET ktoś używał is_numeric.
Jakby to był sposób na bezpieczeństwo to ta funkcja pojawiała się kilkaset razy w średnim projekcie - oczopląsu by można dostać.
Is_numeric służy do walidacji formularza - do zweryfikowania czy użytkownik wpisał liczbę w pole "wiek" oraz do innych, mniejszych spraw, nie do poprawy bezpieczeństwa.
I tak samo wyrażenia regularne - jak wyżej, tutaj już mają wpływ na bezpieczeństwo ale bardziej w wyszukiwaniu niebezpiecznych znaków, stringów itp.
W jaki sposób zapytanie COUNT zwiększa bezpieczeństwo skoro tu oraz w zapytaniu SELECT dodajesz ten sam warunek WHERE z tym samym stringiem pochodzącym z zewnątrz?
Bzdura.
wizarts
10.12.2012, 20:23:03
Cytat(markonix @ 10.12.2012, 14:25:10 )

W jaki sposób zapytanie COUNT zwiększa bezpieczeństwo skoro tu oraz w zapytaniu SELECT dodajesz ten sam warunek WHERE z tym samym stringiem pochodzącym z zewnątrz?
Bzdura.
Fakt. Nie do końca to przemyślałem.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę
kliknij tutaj.