SQL Injection (z ang., dosłownie zastrzyk SQL) – luka w zabezpieczeniach aplikacji internetowych polegająca na nieodpowiednim filtrowaniu lub niedostatecznym typowaniu i późniejszym wykonaniu danych przesyłanych w postaci zapytań SQL do bazy danych. Podatne są na niego systemy złożone z warstwy programistycznej (przykładowo skrypt w PHP, ASP, JSP itp.) dynamicznie generującej zapytania do bazy danych (MySQL, PostgreSQL itp.). Wynika on zwykle z braku doświadczenia lub wyobraźni programisty.
Wynika z tego, że każda aplikacja korzystająca z bazy danych jest narażona na ten wektor ataku. Z jednej strony dość łatwo chronić się przed tym, z drugiej kilku mocnych graczy i tak poległo ( m.in. strona mysql.com → MySQL.com zhackowane… ). Co w takim razie można zrobić, żeby spać spokojnie?
Zabezpieczenie aplikacji
Najważniejsza zasada to:
NIGDY NIE UFAJ DANYM PODAWANYM PRZEZ UŻYTKOWNIKA!
Pisanie bezpiecznej aplikacji to przede wszystkim mnóstwo mało ekscytującego kodu. Kodu, który będzie sprawdzał czy wszystkie dane pochodzące od użytkownika są tym czego się spodziewamy. Na początek zajmijmy się filtrowaniem danych.
Filtrowanie i walidacja danych
Do tego zadania najlepiej nadają się wyrażenia regularne. Taki sposób filtrowania nazywa się białą listą. Dlaczego białą listą? Ponieważ filtrujemy dane na podstawie jakiegoś z góry ustalonego szablonu lub zakresu, np.:
Jak widać różnica między białą a czarną listą jest dość istotna. Biała sprawdza czy wartość jest taka, jaka się spodziewamy. Natomiast czarna lista cechuje się sprawdzaniem czy dana nie jest wartością z jakiegoś zdefiniowanego zakresu. Zaleca się stosowanie białej listy ze względu na fakt, że w przypadku czarnej listy zawsze istnieje możliwość pominięcia jakiejś wartości. Można oczywiście mimo to stosować z takim samym efektem czarną listę, ale w pewnym momencie może się okazać, że ta lista będzie naprawdę długa A to już nie będzie wyglądało elegancko i stanie się mało czytelne.
Oprócz wyrażeń regularnych w PHP od wersji 5.2 mamy wbudowaną funkcję filter_var()z rozszerzenia Filter. Są tam zawarte najpopularniejsze filtry tj.:
FILTER_VALIDATE_EMAIL - sprawdzanie adresu email
FILTER_VALIDATE_PI - sprawdzanie adresu IP
FILTER_VALIDATE_URL - sprawdzanie adresu URL
i wiele wiele innych ( do pełnej listy odsyłam tu, a do opisu tu. Oprócz tego przykład działania: tu).
Krótkie wyjaśnienie: Najpierw definiujemy wysokość i szerokość div’a. Następnie ustawiamy pozycję na absolute i ustawiamy po 50% na left i top. W ten sposób lewy górny róg jest dokładnie na środku ekranu. Teraz wyrównujemy całego diva względem tego punktu, czyli przesuwamy o połowę długości i szerokości w przeciwną stronę.
W ten sposób otrzymujemy wyrownany box w pionie i poziomie do środka. Nie ma na to wpływu rozmiar przeglądarki, a pozycja jest stale utrzymywane nawet po zmianie tego rozmiaru.
Long polling jest to rozwiązanie służące do niemalże natychmiastowej reakcji na zmianę w dowolnym źródle (np. plik tekstowy, baza danych itd), które można zastosować w każdym języku programowania. Ja, jako że to jest mój „główny” język, pokażę jak to zrobić w PHP. Ale zanim do tego przejdę, może zacznę od przedstawienia przykładu, , który pokaże o co tak napradę tutaj chodzi:
index.php
<html>
<head>
<title>long_polling
<script type="text/javascript" src="http://code.jquery.com/jquery-1.6.3.min.js">
<script type="text/javascript">
//
var time = null;
jQuery(document).ready(function() {
check();
});
function check() {
$.ajax({
type: 'GET',
url: 'check.php?time='+time,
async: true,
cache: false,
success: function( data ) {
var json = eval('(' + data + ')');
time = json['time'];
$('#status').text( json['text_from_file'] );
setTimeout('check()', 100);
},
error: function( XMLHttpRequest, textStatus, errorThrown) {
setTimeout('check()', 100);
}
});
}
</head>
<body>
Parę słów wyjaśnienia o co tutaj biega. Mamy 3 pliki
index.php – plik, w którym skrypt startuje i jest pokazywany wynik
check.php – skrypt, który analizuje datę/czas zmiany pliku i na tej podstawie pobiera jego zawartość
test.txt – plik, z którego pobieramy zawartość
Definiujemy w pliku index.php funkcję check() – jest to funkcja z ajaxowym wywołaniem skryptu php. Do skryptu przekazujemy parametr GET, który jest ostatnim czasem zapisu pliku (służy do porównania). W skrypcie (check.php) najpierw pobieramy czas zmiany pliku (funkcja filemtime()) i następnie w pętli while sprawdzamy czy nie zaszła żadna zmiana. Jeśli tak, to przesyłamy tablicę json (funckja odpowiedzialna: json_encode()) a w wartwie widoku wyświetlamy rezultalt.
Jak widać technika bardzo prosta, ale jednocześnie bardzo przydatna.