====== 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 === # 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 ==== 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: 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 [[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: ; 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 ===== * [[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. http://URL.TLD/eingabe.php?id=1' SQL Befehl)? * 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). 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) ==== 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: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. * [[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): * **302 moved temporarily** (redirect): * **404 Page Not Found**: *** Service not avaliable**: * **Content-Type setzen** (hier CSS): * **Cache** (zwingt Browser Dateien nicht zu cachen): * **Download dialog**: * **Authentifizierung** (Browser öffnet ein Benutzername/Passwort-Dialog) - funktioniert nur wenn PHP als [[apache:Apache]]-Modul läuft: