Cytat(Najki @ 25.11.2004, 00:13:57 )

SQL Injection (zwane też "SQL Insertion") to (rzekomo) najprostszy sposób włamu na stronę. Spowodowany jest on niepełnym sformułowaniem zapytań do MySQL.
Przykład. Dajemy na stronie możliwość edycji profilu. Zapytanie do SQL wygląda następująco:
<?php
$query = "update uzytkownicy set pole='$dane' where id='$id'";
?>
Osoba włamująca się na stronę umieszcza całkiem prosty, odpowiedni ciąg znaków/poleceń w dowolnym polu edycji tego profilu, który wygląda np. tak (dla zmiany hasła użytkownika o dowolnie wybranym, przez atakującego numerze ID):
<?php
', haslo='nowe_haslo' WHERE id = '1
?>
W taki oto prosty sposób, osoba atakująca zmieniła hasło użytkownikowi o ID=1 (zazwyczaj administrator). W podobny sposób można również wyciągnąć dowolne dane z tabeli SQL.
W każdym razie. Poszperałem, pomyślałem i zebrałem wszystko do kupy. Zamieszczam to tutaj razem, oraz proszę o rozbudowanie tego topica, gdyż nie znalazłem na tym forum więcej informacji o "SQL Injection".
Oto co możemy dokonać:
1. Możemy sformułować nasze zapytanie do SQL tak:
<?php
$query = 'update `uzytkownicy` set `pole`="'.$dane.'" where `id`="'.$id.'";';
?>
2. Numer ID warto ustawiać w sposób $_GET['id'], lub $_POST['id'], można też ustawić go w nast. sposób:
<?php
$id = (int)$_GET['id'];
?>
Może nie ma tego dużo, ale jest to już jakaś podstawa do zabezpieczenia strony/skryptu przed prostym i niezwykle niebezpiecznym, SQL Injection. Proszę osoby obeznane w tym temacie, aby dopisały tu własne propozycje metod zabezpieczenia się przed tym atakiem.
Ależ problem ;->.
<?php
function SecureQuery($q, $type)
{
switch($type)
{
case 'string':
else $ret = true;
break;
case 'int':
else $ret = true;
break;
}
return $ret;
}
?>
I potem w kodzie, przed zapytaniami:
Dla URL'i z tekstem i cyframi:
<?php
$nazwa_uzytkownika = $_GET['username'];
if(SecureQuery($nazwa_uzytkownika, 'string'))
mysql_query('SELECT * FROM `db_name` WHERE `user_name` = "'.$nazwa_uzytkownika.'"'); ?>
A dla URLi z cyframi zastosujemy
<?php
$ilosc = $_GET['ilosc'];
if(SecureQuery($ilosc, 'int'))
mysql_query('SELECT * FROM `db_name` WHERE `ilosc` = "'.$ilosc.'"'); ?>
Zawsze trzeba kodowac w mysl zasady KISS - (keep it stupid simple).
Pozdrawiam.