Aplikacje PHP mają reputację ponadprzeciętnych problemów bezpieczeństwa. Jakich technik konfiguracji używasz, aby upewnić się, że aplikacja jest bezpieczna?
Szukam pomysłów takich jak:
- Korzystanie z Hardened PHP / Suhosin
- Korzystanie z mod_security
- Wyłączanie register_globals i allow_url_fopen w php.ini
Zwykle używam Linuksa, ale sugeruję również rozwiązania Windows.
źródło
Z mojego doświadczenia wynika, że większość luk w witrynach opartych na języku PHP jest wynikiem złego projektu (witryny), a nie wad samego PHP.
Kilka szybkich wskazówek:
* Możesz także rzucić okiem na krótki post, który napisałem zatytułowany „Zabezpieczanie phpinfo (), w pewnym sensie” i koniecznie przeczytaj komentarze http://egovsergo.com/2009/04/03/protecting-your-phpinfo/ To był szybki pomysł, że musiałem (nieco) chronić phpinfo (), jeśli w jakiś sposób zapomniałem usunąć go z witryny produkcyjnej.
Mówiąc bardziej ogólnie, niektórzy programiści piszą opakowania dla wrażliwych funkcji, które sprawdzają, czy nie jest ustawiona flaga „strona produkcyjna”, i wyłącza wrażliwą funkcję w produkcji.
źródło
Inne parametry, które należy zmienić, aby wzmocnić PHP:
Przechowuj wszystkie błędy PHP w pliku /var/log/phperror.log :
źródło
Dodałem dotdeb repozytoria do mojego /etc/apt/sources.lst
Ponieważ łatają php / apache / mysql znacznie częściej niż Debian.
źródło
Zastanów się
open_basedir
nad konfiguracją „na stronę”.open_basedir
jest ustawieniem php.ini, które uniemożliwi twoim skryptom dostęp do plików poza zdefiniowaną białą listą. Jeśli serwer obsługuje kilka witryn, uniemożliwi to jednej witrynie odczyt ustawień bazy danych z innej witryny. Zapobiegnie również dostępowi do skryptu php / modyfikowaniu podstawowych plików systemowych. Open basedir jest łatwy do skonfigurowania, wystarczy dodać wiersz „php_admin_value open_basedir /my/list/of/folders:/as/a/colon/seperated/list
” do każdego hosta Apache.Zastanów się również nad wyłączeniem silnika skryptów PHP dla wszystkich witryn / folderów, które nie powinny zawierać skryptów PHP (np. Folder przesłanych obrazów). Ponownie, jest to proste, dodaj „silnik php_admin_value wyłączony” do dowolnych wirtualnych hostów Apache, które nie potrzebują php. Aby wyłączyć PHP w katalogu, umieść to samo w znaczniku Directory.
Uruchamiaj uprawnienia do plików tak ściśle, jak to możliwe, unikaj dostępu do zapisu w skryptach PHP dla użytkownika Apache, co zapobiega modyfikowaniu się uruchomionego skryptu lub innych skryptów na tej samej stronie / serwerze. Jeśli to możliwe, unikaj uprawnień 777, określ minimalne uprawnienia wymagane do uruchomienia aplikacji i korzystania z nich.
Jeśli hostujesz wiele witryn, każda z własną bazą danych, użyj osobnego użytkownika MySQL / Postgres dla każdego z nich i ustaw uprawnienia dla każdego użytkownika, tak aby miał on dostęp tylko do odpowiednich baz danych. To znowu zapobiegnie manipulowaniu nieuczciwym skryptem przy bazie danych innej aplikacji.
Suosin, HardenedPHP, mod_security i tym podobne są również cenne, ale używaj ich oprócz ściśle zamkniętej konfiguracji, nie zamiast.
źródło
Suhosin ma dość znaczny koszt wydajności, więc komentarz „nic nie kosztuje” jest nieco odległy.
źródło
Szukasz podstawowych wskazówek dotyczących zapory / topologii? Podoba mi się pomysł używania np. Funta, aby uniemożliwić dostęp bezpośrednio do serwera PHP z niemytych stron internetowych. W ten sposób możesz także oddzielić serwer WWW od innych części sieci.
źródło
Korzystanie z Suhosin / mod_security / SuPHP z pewnością sprawi, że twój serwer PHP będzie bezpieczny. Wyłączenie niektórych funkcji, takich jak exec, passthru, system i escapeshellcmd, również bardzo pomoże.
źródło