PHP: Unterschied zwischen den Versionen

Aus Hostsharing Wiki
Zur Navigation springen Zur Suche springen
K (damit es ggf verständlicher wird)
(27 dazwischenliegende Versionen von 7 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
{{HSDoku-Links}}
PHP wird heute bei HS standardmäßig per FastCGI vorkonfiguriert. Dafür wird in jedem Domainverzeichnis unter fastcgi/ eine phpstub Datei angelegt und der Apache Webserver ist konfiguriert .php Dateien über diesen "Stub" mit den Rechten des Users auszuführen.
PHP wird heute bei HS standardmäßig per FastCGI vorkonfiguriert. Dafür wird in jedem Domainverzeichnis unter fastcgi/ eine phpstub Datei angelegt und der Apache Webserver ist konfiguriert .php Dateien über diesen "Stub" mit den Rechten des Users auszuführen.
Anwender, die lediglich PHP-Dateien hochgeladen haben, brauchen ausdrücklich keine eigene php.ini.


Zur Wiederherstellung des originalen phpstub ist dieser zentral abgelegt als


=== Anpassung der PHP Grundkonfiguration ===
  /usr/local/src/phpstub


Um die PHP Konfiguration an eigene Bedürfnisse anzupassen legt man eine Konfigurationsdatei Namens php.ini oder php-cgi-fcgi.ini im fastcgi Verzeichnis der Domain an. (Für https:// entsprechend im -ssl Verzeichnis.) Als Vorlage kann eine php-cgi-fcgi.ini dienen, die vom HS PHP Maintainer ggf. bereitgestellt wurde.
Anwender, die lediglich PHP-Dateien hochgeladen haben, brauchen ausdrücklich keine eigene php.ini.




Beispiel:
=== Anpassung der PHP Grundkonfiguration ===
 
cd doms/example.com/fastcgi/
cp /opt/php/X.Y.Z/etc/php-cgi-fcgi.ini php.ini


Und anschließend die php.ini anpassen.
Um die PHP Konfiguration an eigene Bedürfnisse anzupassen, legt man eine Konfigurationsdatei namens php.ini im fastcgi Verzeichnis der Domain an (für https:// entsprechend im -ssl Verzeichnis). In dieser Datei müssen nicht alle Konfigurationsoptionen von PHP definiert sein, sondern nur die, die sich gegenüber der Standard php.ini ändern sollen. Diese liegt in /etc/php/VERSION/cgi und kann dort eingesehen werden.


'''Achtung:''' Kommentare nicht mit # einleiten (kann zu unerwarteten Fehlkonfigurationen führen), Kommentarzeichen ist das Semikolon ";".
'''Achtung:''' Kommentare nicht mit # einleiten (kann zu unerwarteten Fehlkonfigurationen führen), Kommentarzeichen ist das Semikolon ";".


Häufig anzupassen sind z.B.:
Häufig anzupassen sind z.B.:
Zeile 31: Zeile 25:




Beispiel: Durch das Löschen des ";" Kommentarzeichens vor "extension=xyz.so" wird das Module geladen. Achtung viele sind per default schon geladen.
Beispiel einer php.ini:  


<pre>
<pre>
Zeile 53: Zeile 47:
Die Brechstange, mit der das Neustarten der PHP Prozesse erzwungen werden kann, ist diese zu killen:
Die Brechstange, mit der das Neustarten der PHP Prozesse erzwungen werden kann, ist diese zu killen:
<pre>
<pre>
killall php -u $USER
killall -u $USER -r php
</pre>
</pre>
 
$USER = ist der aktuell angemeldeten Benutzer und muss nicht durch den Benutzernamen (xyz00 oder xyz00-user) ersetzt werden. Nur die Prozesse des angemeldeten Users $USER werden gelöscht. "-r" bewirkt, dass der Ausdruck "php" als regulärer Ausdruck interpretiert wird. Intern heißen die sichtbaren Prozesse nicht "php" sondern beispielsweise "php7.2"


=== PHP Sicherheit ===
=== PHP Sicherheit ===
Zeile 61: Zeile 55:
==== open_basedir ====
==== open_basedir ====


Sofern der PHP Parameter open_basdir nicht gesetzt ist (Vorgabe) können (kompromittierte) php Skripte an alle Dateien kommen des Users kommen, ohne einen extra Shellzugang installieren zu müssen und dadurch entdeckt zu werden.
Sofern der PHP Parameter open_basdir nicht gesetzt ist (Vorgabe) können (kompromittierte) php Skripte an alle Dateien des Users kommen, ohne einen extra Shellzugang installieren zu müssen und dadurch entdeckt zu werden.


Die Passwortabfrage von Hsadmin bringt eine Abhilfe für die zentralen Dienste. (Sofern Du dein Passwort nicht in eine Datei schreibst und die Abfrage so wieder ausschaltest, wovon besser abzusehen ist.) Doch alle Daten auf die Du als Benutzer zugreifen kannst sind prinzipiell den PHP-Skripten ausgeliefert.
Die Passwortabfrage von Hsadmin bringt eine Abhilfe für die zentralen Dienste. (Sofern Du dein Passwort nicht in eine Datei schreibst und die Abfrage so wieder ausschaltest, wovon besser abzusehen ist.) Doch alle Daten auf die Du als Benutzer zugreifen kannst sind prinzipiell den PHP-Skripten ausgeliefert.
Zeile 70: Zeile 64:
  open_basedir = /home/doms/example.org/subs/
  open_basedir = /home/doms/example.org/subs/


Wenn man mehrere Subdomains hat und diese isolieren möchte, ist dies durch Aufschaltung von lokalen Subdomains auf verschiedene User möglich. (Siehe [[Domain-Aufträge]] )
Wenn man mehrere Subdomains hat und diese isolieren möchte, ist dies durch Aufschaltung von lokalen Subdomains auf verschiedene User möglich. (Siehe https://doc.hostsharing.net/users/administration/domain/index.html )
 
==== Sicherheitskritische Funktionen ====
 
Weitere Dinge die deaktiviert werden sollten, wenn sie nicht benötigt werden, was im allgemeinen der Fall ist, sind: Das öffnen von URLs als Dateien,
 
allow_url_fopen = Off
 
und die Ausführung von Systembefehlen.


==== safe_mode ====
disable_functions = show_source, system, passthru, shell_exec, exec, phpinfo, popen, proc_open
{{Textkasten|rot|Veraltete Option|Die Verwendung des Safe Mode wird explizit '''nicht''' empfohlen. Mit PHP 5.3.0 ist der Safe Mode veraltet, in PHP 6 gibt es diese Option nicht mehr.}}




Dank (Fast)CGI laufen PHP Skripte zwar "nur" mit Userrechten, dennoch ist es ratsam, den PHP safe_mode zu aktivieren, sofern dies mit den eingesetzten PHP Skripten möglich ist. Der safe_mode kann auch die Daten des Users vor (kompromittierten) PHP Skripten schützen. In der php.ini ist dafür die Option


  safe_mode = On


zu setzten, und die weiteren Optionen sind zu prüfen.
===  eigene PHP Konfigurationen und verschiedene nebeneinander verwenden ===


Falls Systembefehle oder Shellskripte ausgeführt werden müssen, sollten diese über ein extra safe_mode_exec_dir außerhalb des open_basedir bereitgestellt werden (z.B. ~/priv/bin).
Um verschiedene PHP Konfigurationen nebeneinander zu verwenden, kopierst Du den phpstub in ein Unterzeichnis von (fast)cgi(-ssl) und mappst (Einträge in der .htaccess) nach Belieben deine PHP Dateien darauf.  
So können beliebig viele Konfigurationen bei einer Domain nebeneinander genutzt werden.


==== Sicherheitskritische Funktionen ====
==== Beispiel muster.example.com ====  
<pre>
mkdir ~/doms/example.com/fastcgi/muster
cp ~/doms/example.com/fastcgi/phpstub ~/doms/example.com/fastcgi/muster/phpstub


Weitere Dinge die deaktiviert werden sollten, wenn sie nicht benötigt werden, was im allgemeinen der Fall ist, sind: Das öffnen von URLs als Dateien,
und wenn benötigt:
vi ~/doms/example.com/fastcgi/muster/php.ini
</pre>


allow_url_fopen = Off
Anschließend muss der Apache Webserver noch angewiesen werden auch diese bestimmte Konfiguration von PHP zu verwenden. Dazu werden der [[.htaccess]] Datei im DocumentRoot der Sub-Domain zwei Zeilen hinzugefügt bzw. eine .htaccess mit den zwei Zeilen angelegt.
Im Beispiel handelt es sich um die Domain muster.example.com, also:


und die Ausführung von Systembefehlen.
<pre>
cd ~/doms/example.com/subs/muster
vi .htaccess


  disable_functions = show_source, system, passthru, shell_exec, exec, phpinfo, popen, proc_open
  AddType application/x-httpd-phpfastcgi .php
Action application/x-httpd-phpfastcgi /fastcgi-bin/muster/phpstub
</pre>


== Vorinstallierte PHP Version wechseln ==
Hostsharing bietet neben der aktuellen Standardversion 7.4 auch PHP 7.0, 7.1, 7.2,  7.3 und 8.0 an.


Um die Version zu wechseln, genügt es, den jeweiligen phpstub auszutauschen. Version 7.3 liegt unter <code>/usr/local/src/phpstub/phpstub73</code>; das Versionformat ist entsprechend <code>/usr/local/src/phpstub/phpstubXX</code>.




=== Spezielle PHP Versionen oder verschiedene Konfigurationen nebeneinander verwenden ===
===phpstub für PHP 8.0 kopieren===


==== Versionen ====
<pre>
$ cp /usr/local/src/phpstub/phpstub80 ~/doms/example.com/fastcgi/
$ cp /usr/local/src/phpstub/phpstub80 ~/doms/example.com/fastcgi-ssl/
</pre>


Um spezielle PHP Versionen zu nutzen kopiert man sich zunächst einen entsprechenden phpstub und eine passende Konfigurationsdatei in das fastcgi Verzeichnis. Die stubs für alternative Debian Versionen sind unter /usr/local/src/phpstub zu finden. Unter /opt/php stehen bei HS darüber hinaus ggf. weitere optionale PHP Versionen zur Verfügung. Für eine PHP_X.Y.Z Version in /opt/php beispielsweise geht man wie folgt vor:
===phpstub für PHP 8.0 aktivieren===


  cd doms/example.com/cgi/
Die .htaccess sollte möglichst zentral im Verzeichnisbaum abgelegt werden:
cp /opt/php/X.Y.Z/bin/phpXYZstub .
  ~/doms/example.com/.htaccess
cp /opt/php/X.Y.Z/etc/php-cgi-fcgi.ini .
Damit durch Anwendungs eigene .htaccess Dateien (Wordpress, Nextcloud etc.) nicht unbeabsichtigt die php Einstellungen verloren gehen.
In der zentralen <code>.htaccess</code> eines Ordners genügt es, die PHP Dateizuordnung zu überschreiben:


Anschließend muss der Apache Webserver noch angewiesen werden auch diese bestimmte PHP Version zu verwenden. Dazu werden der [[.htaccess]] Datei im DocumentRoot der Domain zwei Zeilen hinzugefügt bzw. eine .htaccess mit den zwei Zeilenangelegt. Im Beispiel handelt es sich um die Domain www.example.com, also:
<pre>
AddType application/x-httpd-php80 .php
Action application/x-httpd-php80 /fastcgi-bin/phpstub80
</pre>


cd ~/doms/example.com/subs/www
Damit wird für den aktuellen Ordner und alle Unterordner PHP 8.0 verwendet.
vi .htaccess


Für Version X.Y.Z wären folgende zwei Zeilen einzugeben:
Auf die gleiche Weise können auch PHP 7.1, PHP 7.2 oder PHP 7.3 aktiviert werden.


AddType application/x-httpd-phpcgi .php
== Eigene PHP Version ==
Action application/x-httpd-phpcgi /cgi-bin/phpXYZstub
Es kann auch eine eigene PHP Version im Paket installiert werden.
Eine kurz Anleitung ist unter [[Eigene_PHP_Version]] beschrieben.


==== Verschiedene parallele Konfigurationen ====  
== Eigener PHP FPM Prozess ==


Um verschiedene PHP Konfigurationen nebeneinander zu verwenden, kopierst Du den phpstub in ein Unterzeichnis von (fast)cgi(-ssl) und mappst nach Belieben deine PHP Dateien darauf. (Analog wie für eine andere PHP Version per [[.htaccess]]) So können beliebig viele Konfigurationen nebeneinander genutzt werden.
auf einem Managed Server kann jeder Nutzer nach belieben auch php-fpm als eigenen Prozess starten.
Ein paar Notizen dazu finden sich auf der Seite [[PHP_FPM]].


----
----

Version vom 10. September 2021, 11:47 Uhr

PHP wird heute bei HS standardmäßig per FastCGI vorkonfiguriert. Dafür wird in jedem Domainverzeichnis unter fastcgi/ eine phpstub Datei angelegt und der Apache Webserver ist konfiguriert .php Dateien über diesen "Stub" mit den Rechten des Users auszuführen.

Zur Wiederherstellung des originalen phpstub ist dieser zentral abgelegt als

 /usr/local/src/phpstub

Anwender, die lediglich PHP-Dateien hochgeladen haben, brauchen ausdrücklich keine eigene php.ini.


Anpassung der PHP Grundkonfiguration

Um die PHP Konfiguration an eigene Bedürfnisse anzupassen, legt man eine Konfigurationsdatei namens php.ini im fastcgi Verzeichnis der Domain an (für https:// entsprechend im -ssl Verzeichnis). In dieser Datei müssen nicht alle Konfigurationsoptionen von PHP definiert sein, sondern nur die, die sich gegenüber der Standard php.ini ändern sollen. Diese liegt in /etc/php/VERSION/cgi und kann dort eingesehen werden.

Achtung: Kommentare nicht mit # einleiten (kann zu unerwarteten Fehlkonfigurationen führen), Kommentarzeichen ist das Semikolon ";".

Häufig anzupassen sind z.B.:

  • die Content-Type charset= Vorgabe für den HTTP Header.
  • der maximal verwendbare Hauptspeicher (memory_limit).
  • die maximale Größe hochgeladener Dateien (post_max_size).
  • die aktiven Extensions.


Beispiel einer php.ini:

 ------8< SCHNIPP >8------
 [..]
 memory_limit = 128M (default)
 post_max_size = 8M (default)
 upload_max_filesize = 2M (default)

 [..]
 default_charset = "UTF-8"
 ; (ist sonst iso-8859-1)
 ; Der charset kann aber wiederum durch einen Funktionsaufruf
 ; header("Content-Type: text/html; charset=iso-8859-1")
 ; im PHP-Skript überschrieben werden (sofern output_buffering = On).
 ------8< SCHNIPP >8------

Beachte: Eine geänderte php.ini Konfiguration wird mit FastCGI erst übernommen, wenn die PHP Prozesse des Users (die über längere Zeit laufen bleiben) neu gestartet werden.

Die Brechstange, mit der das Neustarten der PHP Prozesse erzwungen werden kann, ist diese zu killen:

killall -u $USER -r php

$USER = ist der aktuell angemeldeten Benutzer und muss nicht durch den Benutzernamen (xyz00 oder xyz00-user) ersetzt werden. Nur die Prozesse des angemeldeten Users $USER werden gelöscht. "-r" bewirkt, dass der Ausdruck "php" als regulärer Ausdruck interpretiert wird. Intern heißen die sichtbaren Prozesse nicht "php" sondern beispielsweise "php7.2"

PHP Sicherheit

open_basedir

Sofern der PHP Parameter open_basdir nicht gesetzt ist (Vorgabe) können (kompromittierte) php Skripte an alle Dateien des Users kommen, ohne einen extra Shellzugang installieren zu müssen und dadurch entdeckt zu werden.

Die Passwortabfrage von Hsadmin bringt eine Abhilfe für die zentralen Dienste. (Sofern Du dein Passwort nicht in eine Datei schreibst und die Abfrage so wieder ausschaltest, wovon besser abzusehen ist.) Doch alle Daten auf die Du als Benutzer zugreifen kannst sind prinzipiell den PHP-Skripten ausgeliefert.

Mit open_basedir wird festgelegt in welchen Verzeichnissen PHP Skripte lesen und schreiben dürfen. Geprüft wird dabei ob der zu öffnende Pfad mit dem angegebene Pfad beginnt. Es ist daher wichtig ob sich am Ende ein "/" befindet oder nicht. Ein open_basedir von /home/doms/example.org/subs/www (ohne /) erlaubt somit z.B. auch Zugriffe auf die Subdomain www2 etc.

Beispielzeile für die php.ini:

open_basedir = /home/doms/example.org/subs/

Wenn man mehrere Subdomains hat und diese isolieren möchte, ist dies durch Aufschaltung von lokalen Subdomains auf verschiedene User möglich. (Siehe https://doc.hostsharing.net/users/administration/domain/index.html )

Sicherheitskritische Funktionen

Weitere Dinge die deaktiviert werden sollten, wenn sie nicht benötigt werden, was im allgemeinen der Fall ist, sind: Das öffnen von URLs als Dateien,

allow_url_fopen = Off

und die Ausführung von Systembefehlen.

disable_functions = show_source, system, passthru, shell_exec, exec, phpinfo, popen, proc_open



eigene PHP Konfigurationen und verschiedene nebeneinander verwenden

Um verschiedene PHP Konfigurationen nebeneinander zu verwenden, kopierst Du den phpstub in ein Unterzeichnis von (fast)cgi(-ssl) und mappst (Einträge in der .htaccess) nach Belieben deine PHP Dateien darauf. So können beliebig viele Konfigurationen bei einer Domain nebeneinander genutzt werden.

Beispiel muster.example.com

mkdir ~/doms/example.com/fastcgi/muster
cp ~/doms/example.com/fastcgi/phpstub ~/doms/example.com/fastcgi/muster/phpstub

und wenn benötigt:
vi ~/doms/example.com/fastcgi/muster/php.ini

Anschließend muss der Apache Webserver noch angewiesen werden auch diese bestimmte Konfiguration von PHP zu verwenden. Dazu werden der .htaccess Datei im DocumentRoot der Sub-Domain zwei Zeilen hinzugefügt bzw. eine .htaccess mit den zwei Zeilen angelegt. Im Beispiel handelt es sich um die Domain muster.example.com, also:

 cd ~/doms/example.com/subs/muster
 vi .htaccess

 AddType application/x-httpd-phpfastcgi .php
 Action application/x-httpd-phpfastcgi /fastcgi-bin/muster/phpstub

Vorinstallierte PHP Version wechseln

Hostsharing bietet neben der aktuellen Standardversion 7.4 auch PHP 7.0, 7.1, 7.2, 7.3 und 8.0 an.

Um die Version zu wechseln, genügt es, den jeweiligen phpstub auszutauschen. Version 7.3 liegt unter /usr/local/src/phpstub/phpstub73; das Versionformat ist entsprechend /usr/local/src/phpstub/phpstubXX.


phpstub für PHP 8.0 kopieren

$ cp /usr/local/src/phpstub/phpstub80 ~/doms/example.com/fastcgi/
$ cp /usr/local/src/phpstub/phpstub80 ~/doms/example.com/fastcgi-ssl/

phpstub für PHP 8.0 aktivieren

Die .htaccess sollte möglichst zentral im Verzeichnisbaum abgelegt werden:

~/doms/example.com/.htaccess

Damit durch Anwendungs eigene .htaccess Dateien (Wordpress, Nextcloud etc.) nicht unbeabsichtigt die php Einstellungen verloren gehen. In der zentralen .htaccess eines Ordners genügt es, die PHP Dateizuordnung zu überschreiben:

AddType application/x-httpd-php80 .php
Action application/x-httpd-php80 /fastcgi-bin/phpstub80

Damit wird für den aktuellen Ordner und alle Unterordner PHP 8.0 verwendet.

Auf die gleiche Weise können auch PHP 7.1, PHP 7.2 oder PHP 7.3 aktiviert werden.

Eigene PHP Version

Es kann auch eine eigene PHP Version im Paket installiert werden. Eine kurz Anleitung ist unter Eigene_PHP_Version beschrieben.

Eigener PHP FPM Prozess

auf einem Managed Server kann jeder Nutzer nach belieben auch php-fpm als eigenen Prozess starten. Ein paar Notizen dazu finden sich auf der Seite PHP_FPM.