Programowanie w języku PHP » FAQ

Jak wyświetlić źródło pliku PHP i pokolorować jego składnię

Poniższa wskazówka dotyczy projektu Coyote, w którym to użyto własnie funkcji z podanego niżej skryptu.

Kolorowanie składni PHP nie powinno nikomu sprawić problemu, a to dzięki obecności funkcji highlight_file(). W parametrze owej funkcji należy podać jedynie ścieżkę do pliku PHP, a jego kod źródłowy zostanie wyświetlony w oknie przeglądarki.

Względy bezpieczeństwa


Radziłbym jednak otrożnie posługiwać się tą funkcją gdyż np. dzięki niej każdy będzie mógł zobaczyć kod źródłowy - np. pliku config.php, w którym trzymasz hasła do bazy danych. Ta sytuacja tyczy się tylko przypadku, w którym piszesz skrypt do którego nazwa pliku, którego źródło chcesz wyświetlić, jest przekazywana w parametrze - np.

source.php?url=/functions.php

Co będzie jeżeli ktoś wywoła skrypt - np. w ten sposób:

source.php?url=../passwd

A w pliku passwd trzymasz hasła dostępu? Oto przykładowy skrypt, którego NIGDY nie używaj:

<?
   highlight_file($_GET['url']);
?>


Powyższy kod wyświetla po prostu zawartość pliku, którego URL został przekazany do skryptu. W ten sposób włamywacz może odczytać praktycznie każdy plik, który jest umieszczony na serwerze. Dlatego proponuje zabezpieczyć się przed taką ewentualnością...

Zabezpieczanie skryptu


Na początek wypadałoby stworzyć tablicę która zawierałaby listę ignorowanych skryptów, których nie będzie można odczytać:

// ignorowane przy odczycie pliki
  $ignore = Array('/require.php', '/source.php');


Trzeba również pomyśleć o zadeklarowaniu stałej, która zawiera ścieżkę do Twojego katalogu na serwerze - np.

// sciezka do katalogu na serwerze
  DEFINE('USR_HOME_DIR', '/home/www/serwer.com/public_html/');
// rozszerzenie plikow PHP
  DEFINE('EXT', '.php');


Teraz warunki sprawdzające:

 // sprawdzenie, czy taki plik istnieje
  if (!file_exists(USR_HOME_DIR . $_GET['url']))
  {
      Error('Wskazany plik nie istnieje!', '', 0, NORMAL_ERROR);
  }
 
  // sprawdzenie, czy nie jest na liscie ignorowanych plikow
  if (in_array($_GET['url'], $ignore))
  {
      Error('Nie można odczytać pliku!', '', 0, NORMAL_ERROR);
  }
 
  // sprawdzenie jego rozszerzenia (zabezpieczenie przed atakiem)
  if (!preg_match("/(" . EXT . ")$/", $_GET['url']))
  {
      Error('Próba włamania?! Twój adres IP: ' . getenv('REMOTE_ADDR') . ' został odnotowany w naszej bazie danych!', '', 0, NORMAL_ERROR);
  }


Nie zwracaj uwagi na zastosowanie w powyższym kodzie funkcji Error() - stosowana jest ona jedynie na potrzeby projektu Coyote. W każdym razie na samym początku następuje sprawdzenie, czy plik istnieje - wyklucza to ewentualność, gdy włamywacz kształtuje URL w ten sposób:

source.php?url=../passwd

Druga instrukcja sprawdza, czy plik nie znajduje się w tablicy ignorowanych plików, do których nie każdy powinien mieć dostęp.

W końcu trzecia instrukcja sprawdza czy plik ma rozszerzenie .php.

Odczytanie kodu źródłowego


Funkcja higlight_file() ma pewną wadę. Odczytuje zawartość pliku, lecz nie zwraca tej zawartości w postaci łańcucha. Zapisuje treść do bufora. Jeżeli chcemy aby zawartość kodu źródłowego pliku została zapisana do zmiennej należy skorzystać z tej instrukcji:

  ob_start();
  // kolorowanie skladni wybranego dokumentu (zapisanie go do zmiennej $source
  highlight_file($_GET['url']);
  $source = ob_get_contents();
  ob_end_clean();


Od tej pory zmienna $string będzie zawierała pokolorowany kod źródłowy pliku.

1 komentarz