Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: SQL injection i inne ataki
Forum PHP.pl > Forum > Bazy danych > MySQL
eska chojnice
Czy jeśli zablokuję znaki
CODE
'/\:*?"<>|;

Mogę być na ogół pewny że nie grozi mi SQL injection ?

Jakie są jeszcze typy ataków poprzez SQL i na czym polegają, dobrze jeszczy by było jak by ktoś powiedział jak się przed nim zabezpieczyć. jeśli nie będzie to tylko odsyłka do angielskiej strony będzie pomógł wink.gif
droslaw
Blokowanie jakichkolwiek znaków to nie jest dobry pomysł. Czasami będzie trzeba je przechowywać w bazie. Zamiast tego dane powinno się escapować. Dla MySQL`a odpowiednią funkcją do tego celu jest mysql_real_escape_string(). Ta funkcja wstawi "\" przed niebezpiecznymi znakami i nie będą już groźne. Nie zapominij wstawiać wszystkich danych do zapytania w cudzysłowach. Jeśli dasz cudzysłowy, to kiedy użytkownik wpisze instrukcje np. w formularzu zostaną potraktowane jak dane.

Tak może to wyglądać:
  1. // Odbieramy dane z formularza logowania.
  2. $login = mysql_real_escape_string($POST['login']);
  3. $password = mysql_real_escape_string($POST['password']);
  4.  
  5. $query = "SELECT * FROM `users` WHERE `user_name` = '".$login."' AND `user_password` = PASSWORD('".$password."')";
  6. // w $query masz teraz bezpieczne zapytanie.

Możesz też skorzystać z PDO i jego bindowania para
eska chojnice
a jakie są jeszcze ataki?
droslaw
Ataki związane z SQL? Napisałem o wstrzykiwaniu kodu do instrukcji SELECT. Dużo gorsze może byś wstrzyknięcie kodu do instrukcji INSERT, UPDATE albo DELETE. Zabezpieczać się można w tych wypadkach w ten sam sposób. Dane potraktować funkcją mysql_real_escape_string() i koniecznie ograniczyć je w zapytaniu cydzysłowami. Dotyczy to danych nie tylko z formularza ale z każdego źródła, nawet plików na serwerze albo samej bazy danych.

W ostatnim poście ucięło mi końcówkę. Miało być bindowanie parametrów.

Zapomniałem też napisać o problemie jaki stwarza magic_quotes_gpc(). Jeśli magic_quotes jest włączone backslashe dodawane są automatycznie i trzeba najpierw je usunąć za pomocą funkcji stripslashes(). Żeby nie mieszać w kodzie aplikacji najlepiej zrobić to gdzieś na początku. Tak jak tu jest opisane.
thek
Pozwolicie, że się wtrącę, ale jest już na tym forum wątek o sql injection... I to nawet przypięty. Czy naprawdę jest sens powtarzać dokładnie to samo co tam? Zamykam temat by nikt niepotrzebnie się nie rozpisywał.
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.
Invision Power Board © 2001-2024 Invision Power Services, Inc.