Zentrum für Informationsdienste und Hochleistungsrechnen (ZIH) PHP und MySQL Formulare - Datenübertragung mit PHP Zellescher Weg 12 Willers-Bau A109 Tel. +49 351-463 - 32424 Michael Kluge (michael.kluge@tu-dresden.de)
Überblick Client Server Konzept beim PHP-Einsatz Datenübernahme mit PHP Verarbeiten von Dateiuploads Grundlagen zur Dateiarbeit in PHP Sicherheit Tipps und Tricks Michael Kluge / 2
HTML Client Server Konzept Anfrage vom Browser an den Webserver mit Parametern für Skripte Webserver übergibt Parameter an Interpreter Interpreter verarbeitet Parameter Interpreter liefert HTML-Dokument an Webserver Webserver liefert HTML-Dokument an Browser Webbrowser Benutzeroberfläche HTTP Anfrage mit Scriptparametern HTML- Daten Webserver Scriptinterpreter Datenspeicher Server-System Michael Kluge / 3
PHP Datenübernahme aus Formularen Client Server Konzept beim PHP-Einsatz Datenübernahme von Texten Verarbeiten von Auswahlen Verarbeiten von Mehrfachauswahlen Verarbeiten von Radio- und Checkboxen Verarbeiten von Dateiuploads Grundlagen zur Dateiarbeit mit PHP Sicherheit Tipps und Tricks Michael Kluge / 4
Beispiel - Auswahlliste Beispiel Auswahlliste Texteingabefelder Knöpfe Michael Kluge / 5
PHP Datenübernahme globale Variablen in Form eines assoziativen Arrays $_POST -> alles über POST $_GET -> alles über GET $_REQUEST -> beides Webbrowser Benutzeroberfläche HTTP Anfrage mit Scriptparametern HTML- Daten $_FILES -> Dateiuploads Assoziationen des Arrays sind die namen der Formularelemte und Parameter aus der URL Webserver Scriptinterpreter Datenspeicher Server-System Michael Kluge / 6
PHP Datenübernahme (POST) # HTML Seite <form action= form.php method= post > <input type= text name= textfeld value= per post /> <input type= submit /> </form> # PHP Code <?php?> var_dump( $_GET ); var_dump( $_POST ); var_dump( $_REQUEST ); # übermittelte URL forms.php array(0) { array(1) { ["textfeld"]=> string(9) "per post" array(1) { ["textfeld"]=> string(9) "per post" Michael Kluge / 7
PHP Datenübernahme (GET) # HTML Seite <form action= form.php method= get > <input type= text name= textfeld value= per get /> <input type= submit /> </form> # PHP Code <?php?> var_dump( $_GET ); var_dump( $_POST ); var_dump( $_REQUEST ); # übermittelte URL form.php?textfeld=per+get array(1) { ["textfeld"]=> string(9) "per get" array(0) { array(1) { ["textfeld"]=> string(9) "per get" Michael Kluge / 8
PHP Auswahlen und Mehrfachauswahlen Auswahlen, Radioboxen und einzelne Checkboxen werden wie Text übermittelt bei Mehrfachauswahlen muss dem Namen im Quelltext ein [] angehängt werden, damit die Werte als Feld übermittelt werden Michael Kluge / 9
Verarbeiten von Formulardaten mit PHP # HTML Seite <select name= single_value > <option value= p1 selected= selected >Pizza Napoli</option> <option value= p2 >Pizza Salamie</option> </select> <select name= multiple_values[] multiple= multiple > <option value= p1 selected= selected >Pizza Napoli</option> <option value= p2 selected= selected >Pizza Salami</option> </select> # PHP Code <?php var_dump( $_REQUEST['single_value'] ); var_dump( $_REQUEST['multiple_values'] );?> string(2) "p1" array(2) { [0]=> string(2) "p1" [1]=> string(2) "p2" Michael Kluge / 10
PHP Verarbeiten von Dateiuploads Client Server Konzept beim PHP-Einsatz Datenübernahme Verarbeiten von Dateiuploads Upload von Dateien Fehlerbehandlung Restriktionen durch PHP Grundlagen zur Dateiarbeit mit PHP Sicherheit Tipps und Tricks Michael Kluge / 11
PHP Dateiupload # HTML Seite <form action= form.php method= post enctype= multipart/formdata > <input type= file name= dateiupload /> <input type= submit /> </form> # PHP Code <?php?> var_dump( $_REQUEST ); var_dump( $_FILES ); array(1) { ["dateiupload"]=> array(5) { ["name"]=> string(11) "text.txt" ["type"]=> string(10) "plain/text" ["tmp_name"]=> string(18) "/var/tmp/php61qs7v" ["error"]=> int(0) ["size"]=> int(244) Michael Kluge / 12
PHP Fehlercodes beim Upload 0 OK 1 2 3 4 5 6 Datei überschreitet maximale Uploadgröße (serverseitig) Datei überschreitet maximale Uploadgröße (clientseitig) teilweiser Upload Keine Datei hochgeladen Temporäres Verzeichnis fehlt Schreibfehler Michael Kluge / 13
PHP Einschränkungen beim Upload Datei-Uploads deaktivieren file_uploads = 0 -> php.ini Datei-Uploadgröße beschränken upload_max_filesize = 8M -> php.ini maxlength = 8000000 -> html Einstellen des temporären Verzeichnisses upload_tmp_dir -> php.ini Michael Kluge / 14
PHP Dateiarbeit Client Server Konzept beim PHP-Einsatz Datenübernahme Verarbeiten von Dateiuploads Grundlagen zur Dateiarbeit mit PHP Aktionen im Dateisystem Anzeigen von Verzeichnissen Dateiarbeit mit Safe Mode Sicherheit Tipps und Tricks Michael Kluge / 15
PHP Aktionen im Dateisystem Kopieren von Dateien copy( 'quelldatei', 'zieldatei' ) Verschieben von Dateien rename( 'quelldatei', 'zieldatei' ) Speziell für hochgeladene Dateien move_uploaded_file( $_FILES['upload']['tmp_name'], 'zieldatei' ) Löschen von Dateien unlink( 'zieldatei' ) Michael Kluge / 16
PHP Aktionen im Dateisystem Erstellen von Verzeichnissen mkdir( 'zielverzeichnis' ) Löschen von Verzeichnissen rmdir( 'zielverzeichnis' ) Aktuelles Verzeichniss feststellen getcwd() Aktuelles Verzeichniss wechseln chdir( 'zielverzeichnis' ) Michael Kluge / 17
PHP Informationen über Dateien Zeitpunkt der Erstellung filectime( 'datei' ) Zeitpunkt der letzten Änderung filemtime( 'datei' ) Zeitpunkt des letzen Zugriffs fileatime( 'datei') Dateigröße filesize( 'datei' ) Michael Kluge / 18
PHP Verzeichnis Inhalt anzeigen // zu öffnendes verzeichnis festlegen $directory = './'; // verzeichnis öffnen $dir_handle = opendir( $directory ); // elemente anzeigen while( ( $file = readdir( $dir_handle ) )!= false ) { // alle dateien anzeigen (verzeichnisse ausblenden ) if( is_file( $file ) ) { // ausgeben des dateinamens echo $file.'<br />'; Michael Kluge / 19
PHP Dateiarbeit im Safe Mode Safe Mode ist ein Sicherheitsmechanismus, der unter anderem eine Prüfung der Dateirechte aktiviert Nur noch der Besitzer einer Datei kann auf diese Schreiben Problem: Webserver läuft meist als eigener Benutzer, hochgeladene Dateien per FTP gehören aber individuellen Usern -> schreiben auf diese nicht mehr möglich Umgehbar indem man Dateifunktionen über FTP realisiert Michael Kluge / 20
PHP Dateiarbeit (FTP-Copy) function myftp_copy( $src, $trg, $ftpdata ) { $connection = ftp_connect( $ftpdata['ftp_server'] ); $result = ftp_login( $connection, $ftpdata['ftp_user'], $ftpdata['ftp_pass'] ); if ( $connection && $result ) { return ftp_put( $connection, $trg, $src, FTP_BINARY ); else { return FALSE; Michael Kluge / 21
PHP Sicherheit Client Server Konzept beim PHP-Einsatz Datenübernahme Verarbeiten von Dateiuploads Grundlagen zur Dateiarbeit mit PHP Sicherheit Angriffe auf den Server und Daten Cross-Site-Scripting Tipps und Tricks Michael Kluge / 22
PHP Sicherheit $_GET, $_POST, $_REQUEST sind unsicher Angreifer kann URL manipulieren Angreifer kann Quellcode eines Formulares als HTML speichern und manipuliert absenden Zur Sicherheit übermittelte Werte prüfen Passender Datentyp Keine Pfade in Variablen übernehmen register_globals=off Michael Kluge / 23
PHP Überlistete Prüfvariablen # PHP Teil zur Benutzerauthentifizierung if ( $user->is_admin == ADMINISTRATOR) { $admin = 1; if ( $admin == 1) { // Adminbereich anzeigen # Angriff über manipulierte Parameter http://server.de/script.php?admin=1 bei aktiviertem register_globals gelingt so der Zugriff auf dem Admin Bereich Michael Kluge / 24
PHP Zugriff auf sensible Daten Michael Kluge / 25
PHP Cross Site Scripting Angreifer fügt in den übertragenen Text schädlichen Skriptcode oder ein iframe ein Wenn der Code schließlich angezeigt wird kommt der Schadcode zur Ausführung Angriff richtet sich meist gegen andere Besucher der Seite Abhilfe schafft das Ausfiltern von HTML-Tags Wenn Formatierung benötigt Verwendung von alternativer Syntax wie BB-Code Michael Kluge / 26
PHP Tipps und Tricks Client Server Konzept beim PHP-Einsatz Datenübernahme Verarbeiten von Dateiuploads Grundlagen zur Dateiarbeit mit PHP Sicherheit Tipps und Tricks Was man lassen sollte Mehrere Buttons zum Versand Michael Kluge / 27
PHP Was man lieber lassen sollte Spielereien mit JavaScript nicht alle Browser unterstützen JavaScript mancher schaltet es aus nur da wo es keine vitale Funktion hat Geschachtelte Formulare werden derzeit vom Firefox unterstützt sind nicht HTML-konform Mehrere Buttons / Imagebuttons sind nur mit etwas Überlegung möglich Michael Kluge / 28
PHP Mehrere Submit Buttons Ohne Schwierigkeiten möglich, wenn alle Buttons das selbe Ereigniss auslösen Wenn Buttons verschiedene Ereignisse auslösen sollen, treten Probleme auf Lösung 1: alle SUBMIT-Buttons haben selben Namen auswerten des Value-Attributs in PHP unflexibel wenn Text auf dem Button nicht fest ist (Mehrsprachigkeit) Michael Kluge / 29
PHP Mehrere Submit Buttons Lösung 2: Name-Attribut zur Übertragung nutzen Auswerten welcher Button verwendet wurde ( if( isset(... ) ) Lösung 3: kodieren des Wertes innerhalb des Namens automatisches Auswerten mit PHP <form action="test.php" method="post"> <input type="submit" value="alpha" name="mbaction_alpha"> <input type="submit" value="beta" name="mbaction_beta"> </form> Michael Kluge / 30
PHP Mehrere Submit Buttons <?php function multibuttonhandler( $PARAMETERS, $prefix ) { // die namen aller elemente laden $keys = array_keys( $PARAMETERS ); // die namen der übermittelten elemente durchlaufen foreach( $keys as $key ) { // nach dem vorgegebenen prefix suchen if( preg_match( '/^'.$prefix.'(.*)/', $key, $matches ) ) { return $matches[1];?> Michael Kluge / 31
PHP Mehrere Image Buttons Bei der Verwendung von Image-Buttons verschärft sich das Problem Ein Value Attribut ist zwar vorgesehen wird aber nur vom Firefox umgesetzt Jedoch werden die Koordinaten des Mausklicks zusammen mit dem Namen des Elementes übermittelt Anpassung der Funktion für Buttons ermöglicht also auch hier ein Auslesen der kodierten Daten Michael Kluge / 32
PHP Mehrere Image Buttons <?php function imagebuttonhandler( $PARAMETERS, $prefix ) { // die namen aller elemente laden $keys = array_keys( $PARAMETERS ); // die namen der übermittelten elemente durchlaufen foreach( $keys as $key ) { // nach dem vorgegebenen prefix suchen if( preg_match('/^'.$prefix.'(.*).'_[xy]$'/', $key, $matches) ) { return $matches[1];?> Michael Kluge / 33