publikuj: Opublikuj w wykop.pl Opublikuj we flaker.pl Opublikuj na OSnews.pl Opublikuj w delicious wydrukuj
skomentuj »

TAGI: sql injection , tips & tricks , php

2011-03-07 10:35  |  Paweł Gazda

Jak zabezpieczyć się przed atakami SQL Injection (FIEO)

Jak zabezpieczyć się przed atakami SQL Injection (FIEO)

Przeanalizowanie różnych permutacji konkretnego ataku może przynieść wiele korzyści, bo zdobytą wiedzę wykorzystamy w przyszłej prewencji. Dziś pokażemy podstawy zabezpieczenia strony WWW przed atakami SQL Injections.

Każdy deweloper powinien mieć we krwi dobre praktyki bezpieczeństwa podczas tworzenia aplikacji sieciowych. Podstawowa zasada brzmi: "nie ufaj danym pozyskanym z zewnątrz". Kolejna zasada to „eskejpowanie" (escape) danych przed wysłaniem ich w inne miejsce. Przekładając to na angielski: filter input, escape output (FIEO).

Zasadniczą przyczyną występowania SQL Injections jest niedopilnowanie tej drugiej zasady, czyli "escape output". Konkretnie, chodzi o sytuację, kiedy różnica pomiędzy formatem zapytania SQL a danymi użytymi w zapytaniu nie jest starannie monitorowana. Często spotyka się to w aplikacjach PHP, które budują zapytania w następujący sposób.

<?php

$query = "SELECT *

FROM   users

WHERE  name = '{$_GET['name']}'";

?>

W tym przypadku wartość $_GET['name'] podana jest z innego źródła - od użytkownika, ale nie jest to ani filtrowane, ani „eskejpowane".

„Eskejpowanie" zachowuje dane w nowym kontekście. Nacisk na tę czynność można traktować jako przypominacz, że dane użyte poza twoją aplikacją (jeśli nie zostaną „eskejpowane") to mogą zostać źle zinterpretowane. Filtrowanie natomiast zapewnia nas, że dane są poprawne, zanim z nich skorzystamy.

Zakładając, że korzystamy z MySQL, to wrażliwość na atak SQL Injection może zostać zmniejszona przez „eskejpowanie" nazwy poprzez mysql_real_escape_string(). Jeśli nazwa jest również filtrowana, to istnieje dodatkowy poziom bezpieczeństwa. Przykład omawianych czynności (FIEO) znajduje się poniżej.

<?php

// Initialize arrays for filtered and escaped data, respectively.

$clean = array();

$sql = array();

// Filter the name. (For simplicity, we require alphabetic names.)

if (ctype_alpha($_GET['name'])) {

$clean['name'] = $_GET['name'];

} else {

// The name is invalid. Do something here.

}

// Escape the name.

$sql['name'] = mysql_real_escape_string($clean['name']);

// Construct the query.

$query = "SELECT *

FROM   users

WHERE  name = '{$sql['name']}'";

?>

Nazywanie poszczególnych konwencji pomoże wam z zapamiętaniem, co zostało poddane procedurze FIEO. Jednak lepszym sposobem wydaje się skorzystanie z PHP Data Objects (PDO).

Deweloperzy dostają do dyspozycji uniwersalne API do dostępu do danych, gdzie można podpiąć przygotowane wcześniej instrukcje, nawet jeśli wyróżniona baza danych nie istnieje. Przykład poniżej.

<?php

// Provide the query format.

$query = $db->prepare('SELECT *

FROM   users

WHERE  name = :name');

// Provide the query data and execute the query.

$query->execute(array('name' => $clean['name']));

?>

Na stronie z instrukcją do PDO znajdziesz więcej przykładów i informacji.

publikuj: Opublikuj w wykop.pl Opublikuj we flaker.pl Opublikuj na OSnews.pl Opublikuj w delicious wydrukuj
skomentuj »

Polecane książki

Czytaj Webhosting

Chcesz być na bieżąco z naszymi informacjami? Zapisz się na Newsletter.

Zarejestruj domenę

Sprawdź dostępność swojej domeny:

.pl: 0 zł   .com: 19.90 zł
.com.pl: 0 zł   .eu: 19.90 zł