Witam ponownie,
chcę poruszyć dziś kwestię SQL Injection, o którym jest bardzo głośno. Mówi się że z formularza można "zaatakować" bazę danych np: wpisując x' OR '1'='1. Wykonałem testy i nie mogłem pobrać danych z bazy. Bezpośrednio z kodu działa, ale z formularza już nie. Wykonałem sobie próbny plik:
echo '
<form method="POST">
<input type="text" name="name" value=""/>
<input type="submit" value="OK" />
</form>';
if($_POST['name'] != "")
{
$name = "x' or '1'='1";
$db = new Pobierz("SELECT * FROM sqltest WHERE name='".$name."' ORDER BY id");
foreach($db->getAll() as $ele){
foreach($ele as $ele2){
echo $ele2." - ";
}
echo "<br />";
}
}
Co testowałem (podany kod php zastępuje linijkę: $name = "x' or '1'='1";):
index | Co zrobiłem ? | Wynik testu |
---|---|---|
1 | Powyższy kod prezentuje podanie x' OR '1'='1. Jest to jedyna działająca opcja, ale nie tak to ma wyglądać | działa |
2 | Wpisanie w formularz wartości: height' or '1'='1 | błąd |
3 |
$name = $_POST['name'];
| błąd
4 | Jeżeli usuniemy powyższy kod i bezpośrednio do zapytania SQL podamy $name | błąd
5 | Jeżeli usuniemy powyższy kod i bezpośrednio do zapytania SQL podamy $_POST['name'] | błąd
6 | Wpisanie do formularza
x' OR '1'='1
| błąd - dodaje \ przed '
7 | Wpisanie do formularza
x\' OR \'1\'='1
| błąd - dodaje \ przed '
8 | Wpisanie do formularza (ze znakiem ' w kodzie dziesiętnym)
'x' OR '1'='1'
| błąd - jedyny sposób by pobrał zawartość jako x' OR '1'='1 bez dodawania znaku ****. Mimo to brak reakcji (jak zwrócimy echo dla całości to wygląda tak: SELECT * FROM sqltest WHERE name='x' OR '1'='1' ORDER BY id, a mimo to nic się nie dzieje)
Jeszcze jakieś inne testy, ale nie pamiętam. Sprawdzane było na przeglądarkach: Firefox, Explorer, Chrome - i nic. Może wy wiecie co zrobić by to zadziałało. Wszelkie testy robię na WebServ 2.0 i nie ustawiałem żadnych zabezpieczeń (poza standardem ustawień) ???
Jeżeli są jakieś błędy interpunkcyjne to nie zwracajcie na nie uwagi. Słowo błąd oznacza brak pożądanej reakcji kodu.