Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung |
programmiersprachen:php [2015/09/03 18:44] – [Einige nützliche PHP Erweiterungen] st | programmiersprachen:php [2018/08/08 17:07] (aktuell) – st |
---|
| ====== 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> |
| |