Vollbildmodus: Seiteninhalt ohne Menus

PHP

Logo PHP 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.

Installation des Grundsystems

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.

PHP5

Die aktuelle PHP-Version, kann man über das Paket php5 installieren.

PHP4

Diese alten PHP-Versionen sollten nicht mehr benutzt werden.

Anbindungen

Apache

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.

  • libapache2-mod-php5 - für PHP5 als Modul mod_php (alles läuft unter der UID vom Webserver, z.B. www-data)
  • libapache2-mod-suphp - UID für unterschiedliche Benutzer setzen
  • PHP-FPM als fast-cgi-Ersatz

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

.

MySQL

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:

  • php5-mysql

PostgreSQL

Eine weitere Datenquelle für die PHP-Skripte kann auch ein PostgreSQL-Server benutzt werden. (mehr)

Einige nützliche PHP Erweiterungen

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:

  • php5-cgi - CGI-Skripte ausführen.
  • php5-curl - Curl-Unterstützung (Damit kann man Dateien über verschiedene Protokolle übertragen.)
  • php5-gd - Bilder generieren und manipulieren mit PHP (z.B. für Prozentanzeigen).
  • php5-imagick (universe) - Bilder per Imagemagick manipulieren.
  • php5-imap (universe) - IMAP-Unterstützung.
  • php5-pgsql - Das Gleiche wie php5-mysql, nur für das Datenbanksystem PostgreSQL.
  • php5-sqlite3 (universe) - Daten per PHP in einer sqlite3 Datenbank ablegen.
  • php5-cli - PHP-Skripte über die Konsole ausführen

Konfiguration

Upload-Limits

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

Upgrade auf neuere Version

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

Links

Tutorials

Sicherheit

Code-Schnipsel

etc

PHP-Absichern

Erste Regeln:

  • Benutzerein- und allgemein (z.B. Funktionen strip_tags(), htmlspecialchars()), escapeshellarg().
  • gegen XSS- (Ausgaben filtern!) und
  • SQL-Injection-Angriffe absichern (Datenbankspezifische Funktionen, bei mysql mit mysql_real_escape_string() oder bei Oracle mit gebundenen Funktionen (PDO-Erweiterung). Funktioniert ein Anhängen von SQL-Befehlen, z.B. http://URL.TLD/eingabe.php?id=1' SQL Befehl)?
  • Konstruktion von Dateinamen mit realpath() oder basename()
  • Sessions absichern: session_regenerate_id() bei jeder Änderung der Berechtigungsstufe. Speicherort der Session-Dateien in eigenes Verzeichnis verlegen: 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).
  • Dateiuploads misstrauen (Dateinamen: is_uploaded_file() move_uploaded_file()
  • Dateirechte beim erzeugen gleich richtig setzen:umask(077)
  • lieber eingebaute Funktionen benutzen als Befehle auf der Shell auszuführen
  • Variablen initialisieren

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

Viele der Einstellungen können auch in der httpd.conf (nach dem folgenden Muster) für einzelne Verzeichnisse festgelegt werden: 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 sind
  • safe-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 erlaubt
  • display_errors = off : schaltet u.U. verräterische PHP-Fehlermeldung aus
  • Dateiupload-Überlauf (bei POSTs) verhindern (hier 1 MB): post_max_size = 1024768
  • magic_quotes_gpc = Off (Modus ab Version 5.4 entfernt)

Links

PHP optimieren

APC

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/

APCu

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/

PHP Zend Optimizer

Der PHP Zend Optimizer ist Teil der Zend Plattform die auch debugging und monitoring leistet.

Turck MMCache

  • Turck MMCache ist ein PHP-Beschleuniger, -Optimierer, -Encoder und dynamischer Content-Cache. Turck MMCache erhöht die Performance von PHP-Scripts indem sie im kompiliertem Status gecacht werden, so das der bei der Kompilierung entstehende Overhead praktisch komplett eliminiert wird. Es verwendet auch einige Optimierungen, welche die Ausführung von PHP-Scripts beschleunigen. In der Regel wird die Ausführungsgeschwindigkeit von PHP-Script um den Faktor 1-10 erhöht.

eAccelerator

  • eAccelerator: „free open-source PHP accelerator, optimizer, and dynamic content cache“ Ableger von Turck MMCache

ionCube Encoder

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.

XCache

Header-Manipulationen mit PHP

  • 301 moved permanently (redirect):
    <?php 
    header('HTTP/1.1 301 Moved Permanently');
    header('Location: http://www.example.com');
    die();
    ?>
  • 302 moved temporarily (redirect):
    <?php 
    header('Location: http://www.example.com');
    die();
    ?>
  • 404 Page Not Found:
    <?php 
    header('HTTP/1.1 404 Not Found');
    ?>
  • Service not avaliable:
    <?php 
    header('HTTP/1.1 503 Service Temporarily Unavailable');
    header('Status: 503 Service Temporarily Unavailable');
    header('Retry-After: 60');
    ?>
  • Content-Type setzen (hier CSS):
    <?php
    header('Content-Type: text/css');
    ?> 
  • Cache (zwingt Browser Dateien nicht zu cachen):
    <?php 
    header('Expires: Sat, 26 Jul 1997 05:00:00 GMT');
    header('Cache-Control: no-store, no-cache, must-revalidate');
    header('Cache-Control: pre-check=0, post-check=0, max-age=0');
    header ('Pragma: no-cache'); 
    ?>
  • Download dialog:
    <?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);
    ?>
  • Authentifizierung (Browser öffnet ein Benutzername/Passwort-Dialog) - funktioniert nur wenn PHP als Apache-Modul läuft:
    <?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';
    }
    }
    ?>
 
programmiersprachen/php.txt · Zuletzt geändert: 2015/10/16 18:27 von st
 
Backlinks: [[programmiersprachen:php]]