Postanowiłem na własne potrzeby stworzyć pewien szablon konfiguracji PHP opartej o Apache. Podstawowym celem było bezpieczeństwo rozwiązania, a jak udało mi się to zrealizować – życie pokaże. W prezentowanych przykładach pominąłem większość parametrów konfiguracyjnych, a więc podczas tworzenia własnego środowiska na bazie niniejszego artykuły zalecam dostosowanie ich do własnych potrzeb.

Na potrzeby niniejszej konfiguracji użyłem:

  • Linux Slackware w wersji 12. Starałem się nie używać ustawień i pakietów pochodzących z dystrybucji, żeby rozwiązanie było jak najbardziej uniwersalne
  • Apache w wersji 2.2.6
  • FastCGI w wersji 2.4.6
  • PHP w wersji 4.4.7 i 5.2.5

Przyjąłem również kilka założeń:

  • Skrypty PHP powinny być uruchamiane w zamkniętym środowisku (np: chroot() albo open_basedir())
  • Skrypty PHP powinny być uruchamiane z uprawnieniami właściciela pliku/virtualhosta
  • Każdy użytkownik powinien mieć indywidualny folder tmp i folder przechowywania plików sesji
  • Każdy użytkownik sam może wybrać wersji PHP
  • Dla każdego virtualhosta powinien istnieć oddzielny plik php.ini
  • Tworzone rozwiązanie powinno być jak najbardziej uniwersalne. Jednocześnie powinno oferować administratorowi wygodę zarządzania

Przeczytaj resztę wpisu »

Comments 16 komentarzy »

W PHP 5 wprowadzono pewne uproszczenie w tworzeniu plików php.ini np.: dla każdego virtualhosta oddzielnie. Zakładając, że mamy swój ulubiony plik php.ini, umieszczamy w nim na początku coś takiego:

main_domain = "host1.example.com"
main_root_dir = "/var/www/"${main_domain}

Poniżej opisanych dyrektyw, możemy posługiwać się zmiennymi ${main_domain} i ${main_root_dir} np.: w taki sposób:

open_basedir = ${main_root_dir}":/usr/local/php5"
error_log = ${main_root_dir}"/error_log"
upload_tmp_dir = ${main_root_dir}"/tmp"
sendmail_path = "/usr/sbin/sendmail -t -i -f info@"${main_domain}
session.save_path = ${main_root_dir]"/tmp"

Niestety opcja ta nie jest dostępna w PHP 4 i w związku z zamknięciem rozwoju tej wersji, nie zostanie już dodana.

Comments Komentarze są wyłączone

Chciałem sprawdzić czy można użyć kilku plików php.ini zakładając, że każdy kolejny plik nadpisuje ustawienia z plików poprzednich. Testowałem PHP w wersji 4.4.7 i 5.2.5 skompilowane jako CGI ze wsparciem dla FastCGI. Podczas konfiguracji użyłem między innymi parametrów:

--sysconfdir=/etc/php5/cgi
--prefix=/usr/local/php5
--enable-fastcgi

Po krótkim debugowaniu aplikacji okazało się w jakiej kolejności PHP poszukuje plików ini:

./php-cgi-fcgi.ini
/usr/local/php5/bin/php-cgi-fcgi.ini
/etc/php5/cgi/php-cgi-fcgi.ini
./php.ini
/usr/local/php5/bin/php.ini
/etc/php5/cgi/php.ini

Wyżej wymieniona kolejność jest taka sama dla PHP uruchamianego z poziomu FastCGI/CGI. W przypadku pominięcia parametru --enable-fastcgi zmianie ulega nazwa pliku php-cgi-fcgi.ini na php-cgi.ini.

W przypadku PHP uruchomionego jako moduł Apache sprawa ma się trochę inaczej:

./php-apache.ini
/etc/php5/apache/php-apache.ini
./php.ini
/etc/php5/apache/php.ini

(PHP było skompilowane z opcją --sysconfdir=/etc/php5/apache.)

Niestety testy które przeprowadziłem wykazały, że PHP po znalezieniu pierwszego pliku ini pomija dalsze lokalizacje. Planowałem na podstawie tego mechanizmu dać użytkownikom możliwość posiadania własnego pliku php.ini z gwarancją, iż niektóre parametry były by zawsze globalnie nadpisywane (np: open_basedir, czy disable_functions).

Comments Komentarze są wyłączone

Podczas realizacji ostatniego projektu we flashu napotkałem ciekawy problem który zabrał mi dużo więcej czasu niż powinien.

W projekcie zastosowałem pobieranie danych do tworzenia menu z zewnętrznego pliku XML. Plik XML wyglądał tak:

<mainmenu>
<menuitem font="Font1" pagetemplate="1">Menu 1</menuitem>
<menuitem font="Font1" pagetemplate="2">Menu 2</menuitem>
<menuitem font="Font1" pagetemplate="3">Menu 3</menuitem>
</mainmenu>

Jako, że menu było w jednej linii to obliczałem przy użyciu metody TextFormat.getTextExtent() jakich rozmiarów powinno być pole tekstowe, żeby pomieścić tekst. Wszystko działało idealnie do momentu kiedy nie zrobiłem zewnętrznego pliku spełniającego funkcje loadera. Po załadowaniu strony z loadera całe menu się rozjechało – teksty nachodziły na siebie, pola były za małe.

Okazało się, że flash (sprawdzałem na wersji CS3) ma wspaniałą przypadłość:
Jeżeli używasz TextFormat.getTextExtent() na czcionkach dołączonych do animacji, to te same czcionki musisz dołączyć do loadera (nawet jak ich tam nie używasz). W przeciwnym wypadku flash nie będzie potrafił poprawnie policzyć rozmiaru dla pola tekstowego.

Comments Komentarze są wyłączone