2012-10-12 38 views
6

Powiel możliwe:
Best way to prevent SQL injection in PHP?SQL Injection Protection - pojedyncze cytaty

Ive robi trochę badań, aby chronić swoje witryny z SQL Injection. Rozumiem, że jest kilka sposobów na zrobienie tego, Uwalnianie moich danych wejściowych użytkownika, dodawanie ukośników lub jeszcze lepsze używanie sparametryzowanych instrukcji sql.

miałem ten kod testowy ..

$q=$_GET["q"]; 
$game = mysql_query("SELECT * FROM `Games` WHERE `id` = '$q'"); 
$game = mysql_fetch_array($game); 

echo "<h4>ID: ".$game[0]."<br /></h4>name: " . $game[1]; 

Próbowałem kilka SQLi żądań i nie mógł dostać moją stronę testową do błędu, lub wykazują żadnych dodatkowych danych.

Ale kiedy zmieniłem kod SQL do tego (Usunięto apostrofów około $ q) ..

$game = mysql_query("SELECT * FROM `Games` WHERE `id` = $q"); 

mogę wykonywać proste SQLi i uzyskać pewne rezultaty.

Czy wystarczy tylko dobrze zawrzeć moje dane wejściowe użytkownika w pojedynczym cudzysłowie? Czy może obejrzałam bardziej skomplikowane techniki SQLi?

+3

Użyj PDO z przygotowanym wyciągiem. To bezpieczniejsza opcja od teraz w roku 2012. – itachi

+1

Sprawdź, czy twój serwer php ma 'magic_quotes_gpc = ON', który pomoże zapobiec iniekcji SQL – jcho360

+0

Używaj przygotowanych instrukcji (mysqli lub POD). Oszczędza wiele kłopotów, a mysql jest przestarzałe. –

Odpowiedz

1

Spróbuj wkład:

abc' OR id <> ' 

doprowadzi to do następującego stwierdzenia:

"SELECT * FROM `Games` WHERE `id` = 'abc' OR id <> ''" 

Że wróci wszystkie gry, a nie tylko jeden. Jeśli twoja strona pozwala pokazać cały wynik, to na pewno byśmy zobaczyli zbyt wiele ...

Wyjście to użycie PDO z przygotowanymi instrukcjami, są co najmniej funkcją mysqli_real_escape_string() przed wstawieniem danych wejściowych użytkownika do instrukcji SQL .

SQL-Injection może zrobić o wiele więcej, w najgorszym przypadku można nawet uzyskać kontrolę nad serwerem.Spójrz na to SQL Injection Cheat Sheet

+0

Cześć, właśnie wypróbowałem to wejście i nic nie zostało zwrócone. Próbowałem wielu podobnych i otrzymałem taki sam wynik, stąd pytanie, czy wystarczą pojedyncze cytaty. Czy może to być 'magic_quotes_gpc = ON', o którym @ jcho360 wspomniał o powstrzymaniu tych ataków? – user1741863

+1

@ user1741863 - To możliwe, możesz to bardzo łatwo sprawdzić, po prostu wywołaj 'phpinfo() ;, i wywołaj magic_quotes_gpc. Musiałem zrobić prezentację i stworzyć stronę, na której można [grać z iniekcjami SQL] (http://www.martinstoeckli.ch/hash/hash_sqlinjection.php?step=2), niestety jest to po niemiecku. – martinstoeckli

+0

rzeczywiście jest włączony. Dzięki za stronę, przetłumaczyć go na ratunek. – user1741863

0

należy użyć mysql_real_escape_string() funkcję

W tym przypadku trzeba użyć apostrofów

$game = mysql_query("SELECT * FROM `Games` WHERE `id` = '$q'"); 

pozwolić przypuszczać wejściowe użytkownika jest 1' niż wyjściu escape_string będzie 1\'

jeśli jesteś nie używając cudzysłowu niż zapytania, będzie

Ale w apostrofów przypadku

SELECT * FROM `Games` WHERE `id` = '1\'' 

że jest dobra i można usunąć sql-injection

+1

'mysql_ * 'są przestarzałe i zostaną usunięte w przyszłej wersji. – itachi

+0

@itachi nie należy do oversmart.Zobacz pytanie poprawnie 'prawidłowo..Ekcentowanie moich danych wejściowych użytkownika, dodanie ukośników lub jeszcze lepiej za pomocą sparametryzowanych instrukcji SQL ....' – StaticVariable

+0

Negatywne głosowanie nie ma nic wspólnego z pytaniem, ale odpowiedź . Czy to nie jest tak, jak jest? Używasz funkcji, która jest już przestarzała. Stąd ta odpowiedź nie ma integralności w moich oczach, a tym samym w dół. – itachi

Powiązane problemy