Filtrowanie danych wprowadzanych przez użytkownika na pasku adresu

Bezpieczeństwo Zostaw komentarz

Pisząc aplikację należy mieć na uwadze fakt, że użytkownik może manipulować danymi wejściowymi. Poniżej rozważmy prosty przykład strony internetowej

<?php
$go=$_GET['go'];if ($go=='') $go='start.php';
include("gora.php");
include("menu.php");
include($go);
include("dol.php");
?>

Budowa strony jest bardzo prosta: w plikach gora.php i dol.php jest zawarty design serwisu. W pliku menu.php zawarte jest menu serwisu (zbiór linków do podstron). Natomiast najciekawszym fragmentem kodu jest: include($go.”.php”);

Ta linijka jest odpowiedzialna za zaincludowanie odpowiedniego pliku (z treścią strony). Jednak nazwa tego pliku jest przechowywana w zmiennej $go. A ta zmienna to nic innego jak parametr z jakim została wywołana strona w przeglądarce internetowej (np. http://www.strona.pl/index.php?go=kontakt).

Potencjalnym niebezpieczeństwem jest fakt, że dane nie są filtrowane. O ile użytkownik wpisze w parametrze go nieistniejącą nazwę pliku (np.  http://www.strona.pl/index.php?go=nieistniejacy_plik), to pojawi się „jedynie” drobny błąd:

Warning: include(nieistniejacy_plik.php) [function.include]: failed to open stream: No such file or directory in F:\strony\test\index.php on line 7

Warning: include() [function.include]: Failed opening 'nieistniejacy_plik.php' for inclusion (include_path='.;C:\php5\pear') in F:\strony\test\index.php on line 7

Taka strona nie wygląda zbyt profesjonalnie, jednak ten komunikat błędu sam w sobie nie jest groźny (pomijam fakt, że komunikat błędu może zdradzać informacje w jakim katalogu znajdują się pliki, więc ta informacja może w przyszłości nieznacznie ułatwić komuś atak). Dużo groźniejszy jest potencjalny użytkownik, który może spróbować zyskać nieautoryzowany dostęp do plików próbując w polu adresu manipulując danymi wpisać adres niebezpiecznego pliku np. zawierającego hasła ( np. ../../etc/passwd czy też ../data/hasla.txt). Poniższy zrzut ekranu przedstawia przykład używania nieautoryzowanego dostępu do pliku z hasłami (w tym zasymulowanym przykładzie plik z hasłami leży „katalog wyżej w katalogu data”:

Jak się przed tym bronić?? Otóż wystarczy filtrować dane wejściowe. Zakładając, że zmienna go przechowuje nazwę includowanego pliku należy filtrować niedozwolone znaki (np. znak ukośnika oznaczający wejście do innego podkatalogu, dwie kropki oznaczający katalog nadrzędny). Oto nieznacznie zmodyfikowany przykład z prymitywnym filtrowaniem znaków:

<?php
$go=$_GET['go'];
if ($go=='') $go='start.php';$find=array("..", "/", "\\");
$replace=array("", "", "");
$go=str_replace($find, $replace, $go);
if (!file_exists($go)) $go='start.php';
include("gora.php");
include("menu.php");
include($go);
include("dol.php");
?>

W powyższym przykładzie funkcja str_replace wyszukuje „niebezpieczne” znaki i je zastępuje pustym stringiem (czyli usuwa z stringa niebezpieczne znaki). Konkludując wprowadzając daną ../data/hasla.txt zmienna $go będzie przechowywać wartość: datahasla.txt (usunięte ukośniki i pary dwóch kropek uniemożliwiają funkcji include includowanie plików z innego katalogu).

Dodatkowo funkcja file_exits sprawdza, czy podany plik istnieje i jeśli nie istnieje, to załaduje domyślną stronę (start.php) dzięki czemu manipulując przy zmiennej $go gdy podamy nazwę nieistniejącego pliku nie pojawi się komunikat błedu.

Tagi: ,

Zanim dodasz komentarz, zapoznaj się z kilkoma podstawowymi zasadami:

  1. Jeśli zamiast imienia (lub pseudonimu) wpiszesz jakiś mało logiczny ciąg znaków np. asdfg, to taki komentarz zostanie usunięty.
  2. Jeśli się za kogoś podszywasz, to taki komentarz zostanie usunęty
  3. Jeśli zamiast imienia (pseudonimu) wpiszesz jakieś słowo kluczowe (np. tani hosting), to taki komentarz zostanie usunięty
  4. Jeśli Twoim jedynym celem jest zareklamowanie się, to taki komentarz zostanie niezwłocznie usunięty
  5. Komentarze nie związane z tematem notki są kasowane.
  6. Komentarze, które zawierają wulgarne słowa, bądź są obraźliwe (nie dotyczy konstruktywnej krytyki) są kasowane.
  7. Komentarze z mailem typu "nie.podam@coś.tam.pl" są kasowane
  8. Komentarze pisane niechlujnie (bez interpunkcji, w błędami ortograficznymi, z licznymi literówkami, pisane WIELKIMI LITERAMI) są kasowane

Zostaw komentarz

WordPress - Hosting: Twój hosting - Skórka: N.Design Studio - Spolszczenie: Adam Klimowski.
RSS wpisów RSS komentarzy Zaloguj się