PHP ist eine einfach zu erlernende Skriptsprache die vorrangig für dynamische Webinhalte verwendet wird. Daneben kann es allerdings auch auf der Kommandozeile (php-cli) und mit clientseitigen GUI-Anwendungen (http://gtk.php.net) benutzt werden.
PHP ist in zwei Versionen in den Paketquellen enthalten, PHP5 und PHP4. Nicht allen PHP-Skripten ist es egal, unter welcher Version sie ausgeführt werden. Viele aktuelle PHP-Skripte brauchen mittlerweile PHP5, viele alte sind nur kompatibel zu PHP4. Hier muss man sich informieren, welche PHP-Version man installiert haben muss. Üblicherweise sind jedoch alle aktuellen Skripte inzwischen an PHP5 angepasst.
# packages.sury.org deb https://packages.sury.org/php/ jessie main
wget https://www.dotdeb.org/dotdeb.gpg wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
fcgi:
apt install php7.2 php7.2-cgi php7.2-cli php7.2-curl php7.2-gd php7.2-imagick php7.2-json php7.2-mcrypt php7.2-mysql php7.2-pspell php7.2-readline php7.2-tidy php7.2-apcu
mod_php
apt install libapache2-mod-php7.2 php7.2 php7.2-cli php7.2-curl php7.2-gd php7.2-imagick php7.2-json php7.2-mcrypt php7.2-mysql php7.2-pspell php7.2-readline php7.2-tidy php7.2-apcu
Standard-PHP-Auswahl auf 5.6 setzen:
update-alternatives --query php update-alternatives --set php /usr/bin/php5
Die alten PHP-Version, kann man über das Paket php5 installieren.
Bei der Installation von PHP wird auch automatisch das passende Modul für den Webserver Apache installiert. Sollte bei der Installation dieses Paket nicht hinzugefügt worden sein, so kann man diese Pakete nachinstallieren.
Wenn nach der Installation von Apache und PHP die PHP-Dateien nicht angezeigt sondern nur heruntergeladen werden, so kann es sein, dass das Apache Modul nicht ordentlich aktiviert wurde:
a2enmod php5
.
Als Datenquelle für viele PHP Skripte dienen MySQL Server. Zusammen mit Apache und PHP macht das dann einen LAMP Server (Linux, Apache, MySQL und PHP). Die Anbindung an MySQL kann über dieses Paket installiert werden:
Eine weitere Datenquelle für die PHP-Skripte kann auch ein PostgreSQL-Server benutzt werden. (mehr)
Es gibt noch zahlreiche andere nützliche Erweiterungen für PHP, die einfach aus den Quellen installiert werden können. Für PHP5 sind dies unter anderem:
in der php.ini:
; Maximum allowed size for uploaded files. upload_max_filesize = 40M ; Must be greater than or equal to upload_max_filesize post_max_size = 40M
Siehe http://www.php.net/manual/de/install.unix.debian.php und nach Paket-Anbieter „Guillaume Plessis“ suchen. Hier ist immer das aktueller PHP mit allen Zusatz-Paketen verfügbar. Vor dem Upgrade Apache stoppen.
deb http://packages.dotdeb.org stable all
Erste Regeln:
php_value session.save_path /Pfad/zu/SeesionDateien
. Am besten Sessions über eine Datenbank verwalten und keine Datei verwenden (erfordert eigene Funktionen für die Sessionverwaltung).
Evtl. deaktiviert man auch ganze Funktionen (global in der php.ini z.B. mit disable_functions = system
): all-inkl (ein Hosting-Anbieter) deaktiviert z.B. exec(), system(), passthru(), shell_exec(), popen(), escapeshellcmd(), proc_open(), proc_nice(), ini_restore(), eval() ist auch nicht ganz ohne.
man sollte niemals von Benutzern eingegebene Werte mit eval(), preg_replace() incl. /e-Option oder an Systembefehle (wie system(), popen(), passthru() und den Backtick-Operator (``) übergeben.
So etwas muss man letztendlich aber im Anbetracht der Nutzer und den eingesetzten Anwendungen entscheiden.
Tip: Die PHP-Version eines Webservers lässt sich mit dem Aufruf einer beliebigen php-Datei z.B. index.php?=PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000
aus den Response-Headern auslesen (z.B. X-Powered-By: PHP/4.4.4).
empfohlene Sicherheitseinstellungen in der php.ini
php_admin_value open_basedir /var/www/verz1
.
register globals = off
: keine globale Variablen können mehr überschrieben werden, siehe DARUM register globals off. Grund ist das Aufgrund der Standard-variables_order GET oder POST-Parameter vor Cookies verarbeitet werden und der Benutzer also mit einem manipiulierten Cookie evtl. globale Paramter überschreibt. Außerdem sind nicht initialisierte Variablen gefärdet. (Modus ab Version 5.4 entfernt)allow_url_fopen = off
bzw. allow_url_include
(in PHP 5.2.x): keine Skripte von anderen Server können eingebunden werden. Allerdings nicht 100%ig sicher, da php:input or
data:
-URLs weiterhin möglich sindsafe-mode = on
: Dateizugriff nur noch auf Dateien mit Besitzer des Webserverbenutzers, siehe SafeMode Doku (Modus ab Version 5.4 entfernt)open_basedir = /Pfad
: Außerhalb dieses Verzeichnisses ist kein Zugriff erlaubtdisplay_errors = off
: schaltet u.U. verräterische PHP-Fehlermeldung auspost_max_size = 1024768
Benutzbar bis incl. PHP-Version 5.4 (Debian Wheezy).
Installation:
aptitude install php-apc && /etc/init.d/apache2 reload
Statistiken anzeigen:
cp /usr/share/doc/php-apc/apc.php /srv/www/
Ab PHP-Version 5.5 (Debian Jessie).
Installation:
aptitude install php5-apcu && /etc/init.d/apache2 reload
Statistiken anzeigen:
cp /usr/share/doc/php5-apcu/apc.php /srv/www/
Der PHP Zend Optimizer ist Teil der Zend Plattform die auch debugging und monitoring leistet.
ionCube Encoder ist kommerziell und versucht den Code zu verstecken und vor Veränderung zu schützen. Dabei optimiert er auch etwas, aber alles in allem dafür nicht wirklich zu gebrauchen.
<?php header('HTTP/1.1 404 Not Found'); ?>
<?php header('Content-Type: text/css'); ?>
<?php header('Content-Disposition: attachment; filename=' . urlencode($f)); header('Content-Type: application/force-download'); header('Content-Type: application/octet-stream'); header('Content-Type: application/download'); header('Content-Description: File Transfer'); header('Content-Length: ' . filesize($f)); echo file_get_contents($f); ?>
<?php if (!isset($_SERVER['PHP_AUTH_USER'])) { header('WWW-Authenticate: Basic realm="The Realm"'); header('HTTP/1.0 401 Unauthorized'); echo 'If cancel is pressed this text shows'; die(); } else { //always escape your data// $user='user'; $pass='pass'; if($_SERVER['PHP_AUTH_USER']==$user && $_SERVER['PHP_AUTH_PW']==$pass){ echo 'Authorized'; } } ?>