programmiersprachen:php

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
programmiersprachen:php [2007/10/20 20:14] stprogrammiersprachen:php [2018/08/08 17:07] (aktuell) st
Zeile 1: Zeile 1:
 +====== PHP ======
 +{{:programmiersprachen:php-logo.png|Logo PHP}} [[wpde>PHP]] ist eine einfach zu erlernende [[wpde>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.
 +
 +  * **[[Entwickeln mit PHP]]**
 +
 +
 +===== 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.
 +
 +==== PHP7.x ====
 +
 +=== PHP7 auf Debian Jessie ===
 +
 +<file>
 +# packages.sury.org
 +deb https://packages.sury.org/php/ jessie main
 +</file>
 +
 +<code bash>
 +wget https://www.dotdeb.org/dotdeb.gpg
 +wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
 +</code>
 +
 +fcgi:
 +<code bash>
 +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
 +</code>
 +
 +mod_php
 +<code bash>
 +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
 +</code>
 +
 +Standard-PHP-Auswahl auf 5.6 setzen:
 +
 +<code bash>
 +update-alternatives --query php
 +update-alternatives --set php /usr/bin/php5
 +</code>
 +
 +
 +==== PHP5.x ====
 +
 +Die alten PHP-Version, kann man über das Paket **php5** installieren.
 +
 +
 +===== Anbindungen =====
 +
 +==== Apache ====
 +
 +Bei der Installation von PHP wird auch automatisch das passende Modul für den Webserver [[http://wiki.ubuntuusers.de/Apache|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
 +  * [[http://www.phphatesme.com/blog/allgemein/php-fpm-mit-der-lizenz-zum-verwalten/|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: <code bash>a2enmod php5</code>.
 +
 +
 +
 +==== 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 [[http://wiki.ubuntuusers.de/MySQL|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. ([[http://wiki.ubuntuusers.de/PostgreSQL|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 [[http://wiki.ubuntuusers.de/Imagemagick|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:
 +<file>
 +; Maximum allowed size for uploaded files.
 +upload_max_filesize = 40M
 +
 +; Must be greater than or equal to upload_max_filesize
 +post_max_size = 40M
 +</file>
 +===== 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 =====
 +  * [[http://www.php-faq.de/|de.comp.lang.php.* FAQ]]
 +  * [[http://www-128.ibm.com/developerworks/opensource/top-projects/php.html|PHP project resources]]
 +  * [[http://www.heise.de/developer/artikel/Die-Entwicklung-von-PHP-5-4-im-Ueberblick-1473269.html|Die Entwicklung von PHP 5.4 im Überblick]]
 +
 +==== Tutorials ====
 +
 +
 +  * [[http://www.selfphp.info/|SelfPHP]]
 +  * [[http://www.schattenbaum.net/php/|PHP für dich (PHP-tutorial)]]
 +  * [[http://www.hudzilla.org/phpbook/|Practical PHP Programming]]
 +  * [[http://de.wikibooks.org/wiki/Websiteentwicklung:_PHP|Wikibooks: Websiteentwicklung: PHP]]
 +  * [[http://aktuell.de.selfhtml.org/tippstricks/php/|PHP-Tricks]]
 +  * [[http://www.selfphp.info/index.php|SELFPHP]] [[http://www.selfphp.info/kochbuch/index.php|PHP Kochbuch]] [[http://www.selfphp.info/praxisbuch/index.php|PHP 5 Praxis]]
 +  * [[http://mgeisler.net/php-tutorial/|Einfacher Einstieg in PHP]]
 +  * [[http://www.tutorialized.com/tutorials/PHP/1]]
 +  * [[http://tut.php-q.net/|Php-Tutorial von Quake.net]]
 +  * [[http://www.randomchaos.com/documents/?source=php_and_unicode|How to develop multilingual, Unicode applications with PHP]]
 +  * [[http://manuals.phpforum.de/php/|ein PHP Handbuch]]
 +
 +==== Sicherheit ====
 +
 +  * [[http://www.heise.de/security/artikel/84149/0|Gesundes Misstrauen - Sicherheit von Webanwendungen]]
 +
 +==== Code-Schnipsel ====
 +
 +
 +  * [[http://www.php-resource.de/|PHP-resource.de]]
 +  * [[http://www.php-archiv.de/|phparchiv.de]]
 +  * [[http://www.dynamicwebpages.de/03.skript-archiv.php|Skript Archiv]]
 +  * [[http://www.artmedic-phpscripts.de/|artmedic Freeware PHP-Scripts]]
 +  * [[http://www.script-fundgrube.de/|Script-Fundgrube]]
 +
 +==== etc ====
 +
 +  * [[http://wiki.ubuntuusers.de/PHP|kurze Übersicht zu PHP]] (teilweise Quelle dieses Artikels)
 +  * [[http://phpxref.com/|phpXref - a PHP cross referencing documentation generator]]
 +  * [[http://it.slashdot.org/article.pl?sid=07/09/09/215230|PHP5 Vs. CakePHP Vs. RubyOnRails?]]
 +
 +
 +
 +
 +
 +===== PHP-Absichern =====
 +
 +Erste Regeln:
 +  * Benutzerein- und allgemein  (z.B. Funktionen [[http://php.net/manual/en/function.strip-tags.php|strip_tags()]], [[http://www.php.net/manual/en/function.htmlspecialchars.php|htmlspecialchars()]]), [[http://www.php.net/manual/de/function.escapeshellarg.php|escapeshellarg()]].
 +  * gegen XSS- (Ausgaben filtern!) und 
 +  * SQL-Injection-Angriffe absichern (Datenbankspezifische Funktionen, bei [[datenbanken:mysql]] mit [[http://www.php.net/mysql_real_escape_string|mysql_real_escape_string()]] oder bei Oracle mit gebundenen Funktionen (PDO-Erweiterung). Funktioniert ein Anhängen von SQL-Befehlen, z.B. <nowiki>http://URL.TLD/eingabe.php?id=1' SQL Befehl</nowiki>)?
 +  * Konstruktion von Dateinamen mit [[http://www.php.net/manual/de/function.realpath.php|realpath()]] oder [[http://www.php.net/manual/de/function.basename.php|basename()]]
 +  * Sessions absichern: [[http://www.php.net/manual/de/function.session-regenerate-id.php|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: [[http://www.php.net/manual/de/function.is-uploaded-file.php|is_uploaded_file()]] [[http://www.php.net/manual/de/function.move-uploaded-file.php|move_uploaded_file()]]
 +  * Dateirechte beim erzeugen gleich richtig setzen:[[ http://www.php.net/manual/de/function.umask.php|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).
 +
 +
 +<box 100% blue round left |**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 [[http://www.heise.de/newsticker/meldung/73656|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 [[http://de.php.net/manual/de/features.safe-mode.php|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''
 +  * [[http://www.php-faq.de/q/q-magic-quotes.html|magic_quotes_gpc = Off]] (Modus ab Version 5.4 entfernt)
 +
 +</box>
 +
 +==== Links ====
 +  * [[http://www.heise.de/security/artikel/96564/Grundsicherung-fuer-PHP-Software|PHP-Anwendungen individuell absichern]]
 +  * [[http://www.hardened-php.net/|Hardened PHP-Projekt]] bietet einen [[http://www.hardened-php.net/index.14.html|Hardening-Patch]]. Er ist allerdings nicht binärkompatibel zum orginalen PHP
 +  * dafür gibt es **[[http://www.hardened-php.net/suhosin.127.html|Suhosin]]** ([[http://www.howtoforge.com/suhosin_php_debian_etch_ubuntu|Suhosin (Debian) HowTo]])
 +  * [[http://www.securityfocus.com/infocus/1706|Securityfocus: Securing PHP]]
 +  * [[http://developers.slashdot.org/comments.pl?sid=211706&cid=17234626|Re:Not up-to-date on PHP security]]
 +  * [[http://www.heise.de/newsticker/meldung/73837|PHP-Sicherheit: Vorsicht vor popen() und proc_open(]]
 +
 +===== PHP optimieren =====
 +
 +  * [[http://itst.net/654-php-on-fire-three-opcode-caches-compared|[Update] PHP on Fire: Five Opcode Caches compared.]]
 +  * [[http://www.ipersec.com/index.php?q=en/bench_ea_vs_apc|Benchmarking PHP accelerators]]
 +
 +
 +==== APC ====
 +
 +Benutzbar bis incl. PHP-Version 5.4 (Debian Wheezy).
 +  * [[http://pecl.php.net/package/APC|APC]]
 +  * [[http://www0.fh-trier.de/%7Ebeckerr/apcphpgui.phtml|APC Gui]]
 +
 +Installation:<code bash>aptitude install php-apc && /etc/init.d/apache2 reload</code>
 +Statistiken anzeigen: <code bash>cp /usr/share/doc/php-apc/apc.php /srv/www/</code>
 +
 +==== APCu ====
 +Ab PHP-Version 5.5 (Debian Jessie).
 +
 +Installation:<code bash>aptitude install php5-apcu && /etc/init.d/apache2 reload</code>
 +Statistiken anzeigen: <code bash>cp /usr/share/doc/php5-apcu/apc.php /srv/www/</code>
 +
 +==== PHP Zend Optimizer ====
 +
 +Der PHP Zend Optimizer ist Teil der Zend Plattform die auch debugging und monitoring leistet.
 +  * [[http://www.zend.com/store/products/zend-optimizer.php]]
 +  * [[http://www.administrator.de/PHP_Zend_Optimizer_installieren.html|Zend installieren]]
 +
 +
 +==== Turck MMCache  ====
 +  * [[http://turck-mmcache.sourceforge.net/|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 ====
 +  * [[http://eaccelerator.net/|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 ====
 +[[http://trac.lighttpd.net/xcache/|XCache Homepage]]
 +
 +
 +
 +===== Header-Manipulationen mit PHP =====
 +
 +
 +  * **301 moved permanently** (redirect): <code php><?php 
 +header('HTTP/1.1 301 Moved Permanently');
 +header('Location: http://www.example.com');
 +die();
 +?></code>
 +  * **302 moved temporarily** (redirect): <code php><?php 
 +header('Location: http://www.example.com');
 +die();
 +?></code>
 +  * **404 Page Not Found**:<code php><?php 
 +header('HTTP/1.1 404 Not Found');
 +?></code>
 +  *** Service not avaliable**:<code php><?php 
 +header('HTTP/1.1 503 Service Temporarily Unavailable');
 +header('Status: 503 Service Temporarily Unavailable');
 +header('Retry-After: 60');
 +?></code>
 +  * **Content-Type setzen** (hier CSS): <code php><?php
 +header('Content-Type: text/css');
 +?> </code>
 +  * **Cache** (zwingt Browser Dateien nicht zu cachen): <code php><?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'); 
 +?></code>
 +  * **Download dialog**: <code php><?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);
 +?></code>
 +  * **Authentifizierung** (Browser öffnet ein Benutzername/Passwort-Dialog) - funktioniert nur wenn PHP als [[apache:Apache]]-Modul läuft: <code php><?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';
 +}
 +}
 +?></code>