TAPS (Tool for Automatically Preparing SQL queries) to narzędzie, wymyśłone przez trzech naukowców z Uniwersytetu Illonis.
Przykładowe zapytanie
SELECT * FROM tabela WHERE name = ‘”.$_POST[‘parameter’].”‘
,w przełożeniu na język zrozumiały dla człowieka brzmi:
Wybierz wszystko z tabeli ‘tabela’ gdzie id to…
Jeśłi zły hax0r do tej tablicy wpisze Chris.’ OR 1=1 Może wyjąć wtedy wszystkie dane z tej tabeli – nie tylko ograniczone imieniem Chris (jeśli źłe wstawiłem .’ proszę mnie poprawić).
A co, jeśli zmieni parametry tak, aby zakończyć zapytanie i dokleić formułę kasującą zawartość całej tabeli?
Naturalnie najlepszym sposobem obrony jest stosowanie filtrów wbudowanych w PHP (funkcje przygotowane przez twórców języka, np. mysql_real_escape_string()). Dobrym sposobem jest jednak użwanie tzw. prepared statements.
Prosty kod ze sklejanymi zapytaniami SQL dzięki narzędziu TAPS zamieni się w o wiele bezpieczniejszy. Oto przykład:
function test1()
{
$a = $_GET[‘user’];
$query = “delete from test1 where u = ‘”.$a.”‘”;
@mysql_query($query);
}
Po przetransformowaniu kodu wygląda on następująco:
function test1()
{
$a = $_GET[‘user’];
$query__args = $a ;
$query = “delete from test1 where u = ?” ;
executePS( $query , $query__args );
}
Niestety narzędzie nie chciało zaakceptować mojego kodu i sypało błędami – dziwne, bo pokazywanie publicznie błędów własnej aplikacji nie jest bezpieczne. Twórcy starają nam się wcisnąć narzędzie do pomocy przy zabezpieczaniu własnych aplikacji, nie dbając o to, aby ich była bezpieczna. :)
Warto jednak zapoznać się z TAPSem. Jest to bardzo ciekawa inicjatywa, choć nic nie zastąpi nam “własnego mózgu”.