Abbildung 6-8: Abfolge beim doppelten Abschicken von Formularen

Ähnliche Dokumente
php Hier soll ein Überblick über das Erstellen von php Programmen gegeben werden. Inhaltsverzeichnis 1.Überblick Parameterübergabe...

PHP Schulung Beginner. Newthinking Store GmbH Manuel Blechschmidt

Multimedia im Netz Wintersemester 2013/14. Übung 10 (Nebenfach)

Multimedia im Netz. Übung zur Vorlesung. Ludwig-Maximilians-Universität Wintersemester 2010/2011

PHP Einsteiger Tutorial Kapitel 4: Ein Kontaktformular in PHP Version 1.0 letzte Änderung:

Fakultät für Informatik & Wirtschaftsinformatik DB & IS II SS 2015 PHP MVC. Dr. Christian Senger. PHP MVC 1 von 21

MySQL, phpmyadmin & SQL. Kurzübersicht

Praktikum im Grundstudium

Begleitskript. zum PHP/MySQL. Kurs

Einführung in PHP und MySQL

Dateneingabe über ein HTML-Formular in eine Datenbank:

Datenbanksysteme SS 2007

Kontrollstrukturen MySQL Funktionen. MySQL 4, 5. Kapitel 20a: PHP Teil 2. Marcel Noe

E-Commerce: IT-Werkzeuge. Web-Programmierung. Kapitel 6: Datenbankabfragen mit SQL und PHP. Stand: Übung WS 2014/2015

Datenbanken erstellen Liste von Datenbanken anzeigen Datenbanken löschen. MySQL 4, 5. Kapitel 06: Datenbanken. Marcel Noe

Datenbanken für Online Untersuchungen

7. Datenbank-Zugriff. Vorlesung und Übung Dr. Peter Pfahler Institut für Informatik Universität Paderborn. Zum Beispiel aus PHP-Skripten: Client 7-2

Ablauf Unit2. Walkthrough

Übungen. DI (FH) Levent Öztürk

PHP + MySQL. Die MySQL-Datenbank. Hochschule Karlsruhe Technik & Wirtschaft Internet-Technologien T3B250 SS2014 Prof. Dipl.-Ing.

Multimedia im Netz Wintersemester 2013/14. Übung 03 (Nebenfach)

Grundlagen der Informatik 2

Zugriff auf Firebird-Datenbanken mit PHP. Daniel de West DB-Campus-Treffen 15. Januar 2004

Übungsblatt 8- Lösungsvorschlag

Programmieren 2 (Prof. Hasbargen) Klausur

PHP und MySQL. Integration von MySQL in PHP. Zellescher Weg 12 Willers-Bau A109 Tel Michael Kluge (michael.kluge@tu-dresden.

2. Interaktive Web Seiten. action in Formularen. Formular. Superglobale Variablen $ POST, $ GET und $ REQUEST. GET und POST

MySQL-Befehle. In diesem Tutorial möchte ich eine kurze Übersicht der wichtigsten Befehle von MySQL geben.

Datenbanken. Ein DBS besteht aus zwei Teilen:

Projekt Online-Shop:

Datenbanken SQL Einführung Datenbank in MySQL einrichten mit PhpMyAdmin

PHP-Security. Aleksander Paravac. Aleksander Paravac (GNU/Linux User Group Bamberg/Forchheim) 1 / 27

E-Commerce: IT-Werkzeuge. Web-Programmierung. Kapitel 4: Einführung in JavaScript Stand: Übung WS 2014/2015. Benedikt Schumm M.Sc.

Übung zur Vorlesung Multimedia im Netz

Entwicklung einer Suchmaschine mit dem Internet Information Server

Programmieren der Untersuchung

Hochschule Karlsruhe Technik und Wirtschaft Anhänge: Fakultät für Informatik und Wirtschaftsinformatik SS 2013 Prof. Schmidt.

Folien php/mysql Kurs der Informatikdienste

Softwaretechnik Teil Webprogrammierung (HTML, PHP) SS2011

4 MySQL-Daten im Web publizieren

Prozedurale Datenbank- Anwendungsprogrammierung

Datenbanksysteme SS 2007

Web Visu Tutorial. Hipecs Web Visu. Übersicht

Ablauf. Wichtige Termine. Vertiefendes Übungsprojekt - SQL II

Entwicklungsumgebung für die Laborübung

Übung 1: Ein Website News-System mit MySQL

Hackerpraktikum Versuch 4

Relationale Datenbanken in der Praxis

Einführung in PHP. (mit Aufgaben)

PHP JavaScript Kapitel 9. Java-Script-Objekte und das Event-Modell

VWA Rhein-Neckar Dipl.-Ing. Thomas Kloepfer. Kommunikation I (Internet) Übung 5 Formulare

Dr. Christian Senger DB & IS II, SS

Multimedia im Netz Wintersemester 2011/12

Sessions mit PHP. Annabell Langs Sessions in PHP - Annabell Langs 1

Gregor Kuhlmann Friedrich Müllmerstadt. MySQL. Der Schlüssel zu Datenbanken-Design und -Programmierung. c 3 E. i- O Rowohlt Taschenbuch Verlag

Scripting Server (Lamp) Domain Hosting

PHP 5.4 ISBN Fortgeschrittene Techniken der Web-Programmierung. Bastian Martin, Andreas Dittfurth. 1. Ausgabe, April 2013 GPHP54F

"Die HTML-PHP-Schnittstelle -- Ein- und Ausgabe der Daten"

Typo 3 installieren. Schritt 1: Download von Typo3

DVA Praktikum Versuch 1 Gruppe 20 von Yannic Chermette, Tobias Kloastermair und Philipp Kaufman

for ($i=1 ;$i<=25 ;$i++) { echo "$i "; }?> <br> <a href=" zur Index-Seite</a> </body> </html>

Kapitel 33. Der xml-datentyp. In diesem Kapitel: Der xml-datentyp 996 Abfragen aus xml-datentypen 1001 XML-Indizierung 1017 Zusammenfassung 1023

PHP. Prof. Dr.-Ing. Wolfgang Lehner. Diese Zeile ersetzt man über: Einfügen > Kopf- und

Interaktive Webseiten mit PHP und MySQL

Dipl. Inf. Eric Winter. PostgreSQLals HugeData Storage Ein Erfahrungsbericht

Formulare in html Bernd Bl umel Version: 1. April 2003

Datenbank - Teil 3. Ziele: Eine Datenbank anlegen mit SQL. Daten eingeben mit SQL. Abfragen stellen mit SQL und PHP.

Fakultät für Informatik & Wirtschaftsinformatik DB & IS II - SS Metadaten

Active Server Pages. Internetanbindung von Datenbanken. Gliederung. Einführung in ASP. Sessions mit ASP. Datenbankanbindung mit ASP ASP-1

Prüfungsnummer: deutsch. Prüfungsname: Querying. Version: Demo. SQL Server

TYPO3 und TypoScript

Web-Anwendungen Teil 2 PHP kl. Studienprojekt (Praktikum) Winter 2014/ Daniel Fett

desk.modul : WaWi- Export

Verbindung zur Oracle-Datenbank auf dem Server der Fachhochschule Regensburg herstellen

Fachhochschule Brandenburg University of Applied Sciences

MySql und PHP. Apache2: Konfigurieren für php4. ...\apache2\conf\httpd.conf aufrufen. Folgende Zeilen einfügen:

Access [basics] Aktionsabfragen per VBA ausführen. Beispieldatenbank. Aktionsabfragen. Die Execute-Methode. Datenzugriff per VBA

Dynamische Webseiten mit PHP 1

7. Datenbank-Zugriff. Vorlesung und Übung Dr. Peter Pfahler Institut für Informatik Universität Paderborn. Zum Beispiel aus PHP-Skripten: Client 7-2

Datenbanksysteme 2009

Dipl. Inf. Dipl. Math. Y. Orkunoglu Datum:

PHP und Datenbanken. Verbindung zum Datenbankserver

Kurze Einführung in PHP

Dynamik bis zur DB-Interaktion. Marc Schanne. CGI Möglichkeiten

5.8 Bibliotheken für PostgreSQL

Der Inhalt dieses Foliensatzes ist nicht klausurrelevent!!! - aber trotzdem interessant ;-)

Programmierung von Webapplikationen mit Perl / MySQL

11 Pull-Down-Menu und Datenbank

ESB - Elektronischer Service Bericht

Marco Spitzbarth Fabrikstr Zürich

Folien php/mysql Kurs der Informatikdienste

Inhalt. Ein Einführung in die Nutzung von SQL-Datenbanken am Beispiel Oracle. Daten und Tabellen - ein Beispiel. Daten und Tabellen - Normalisierung

Internetanbindung von Datenbanken

SSO-Schnittstelle. Inhalt: Beschreibung der Single Sign-On (SSO) Schnittstelle. NetSlave GmbH Simon-Dach-Straße 12 D Berlin

Aktuelle Sicherheitsprobleme im Internet: Angriffe auf Web-Applikationen

Aufgaben HTML Formulare. Prof. Dr. rer. nat. Claus Brell, Wirtschaftsinformatik, Statistik

Chancen und Wachstumsfelder für PostgreSQL

Transkript:

HACK #55 Hack Doppeltes Abschicken von Formularen verhindern Durch die Verwendung einer Transaktionstabelle in Ihrer Datenbank können Sie das klassische Problem der doppelt abgeschickten Formulare verhindern. Beim Entwurf von Webapplikationen gibt es zwei Dinge, die mir so richtig auf die Nerven gehen: Eines davon ist die Menge an schlechtem Code, mit dem das Problem des doppelten Abschickens von Formularen gelöst werden soll. Wie oft haben Sie schon eine E-Commerce-Website gesehen, die Sie anfleht:»bitte den Senden-Button nicht zweimal anklicken.«? Dieses klassische Problem tritt auf, wenn ein Browser den Inhalt eines Webformulars mehr als einmal an den Server schickt. Andererseits ist das genau das Verhalten, das von einem gut erzogenen Webbrowser erwartet wird, wenn der Benutzer den Senden-Button zweimal anklickt; es liegt also beim Server herauszufinden, ob ein Fehler vorliegt oder nicht. In Abbildung 6-8 sehen Sie eine grafische Darstellung des Problems. Der Browser schickt zwei identische Anfragen an den Server, da der Benutzer zweimal geklickt hat. Die erste Senden-Anweisung wird akzeptiert, und bevor der Server die Antwort schicken kann, wird das Formular ein zweites Mal gesendet. Dann wird die erste Antwort an den Browser zurückgegeben, gefolgt von der zweiten Serverantwort. #55 Abbildung 6-8: Abfolge beim doppelten Abschicken von Formularen Abbildung 6-9 zeigt eine Möglichkeit, das Problem mit dem doppelten Abschicken in den Griff zu bekommen. Die erste Abfrage speichert in der zu verarbeitenden Seite eine einmalige ID. Kommt eine zweite Abfrage mit der gleichen ID beim Server an, kann die redundante Transaktion abgelehnt werden. Hack #55: Doppeltes Abschicken von Formularen verhindern 243

#55 Doppeltes Abschicken von Formularen verhindern Abbildung 6-9: Die Lösung des Problems besteht darin, die zweite Anforderung abzulehnen Der Code Sichern Sie den Code aus Beispiel 6-7 als db.sql. Beispiel 6-7: Der SQL-Code für die Transaktionstabelle DROP TABLE IF EXISTS transcheck; CREATE TABLE transcheck ( transid TEXT, posted TIMESTAMP ); Speichern Sie nun den in Beispiel 6-8 gezeigten Code als index.php. Beispiel 6-8: Das HTML-Formular, das die Transaktions-ID enthält <? require_once( "trans.php" );?> <html> <body> <form action="handler.php" method="post"> <input type="hidden" name="transid" value="<?php echo( get_transid( ) );?>" /> Name: <input type="text" /><br/> Menge: <input type="text" size="5" /><br/> <input type="submit" /> </format> Der Code aus Beispiel 6-9 gehört in die Datei handler.php. Beispiel 6-9: Der Code, der die Formulardaten entgegennimmt und die Transaktion überprüft <? require_once( "trans.php" );?> <html> <body> <?php if ( check_transid( $_POST["transid"] ) )?> Dieses Formular wurde bereits abgeschickt. <?php else 244 Kapitel 6: Applikationsdesign

Beispiel 6-9: Der Code, der die Formulardaten entgegennimmt und die Transaktion überprüft (Fortsetzung) add_transid( $_POST["transid"] );?> Herzlichen Glückwunsch zum Kauf dieses unglaublich wertvollen Produkts. Vielen Dank! <?php?> </body> </html> Speichern Sie den Code aus Beispiel 6-10 in der Datei trans.php. Beispiel 6-10: Die Bibliothek zum Überprüfen der Transaktion <?php require_once( "DB.php" ); $dsn = 'mysql://benutzername:passwort@localhost/transtest'; $db =& DB::Connect( $dsn, array( ) ); if (PEAR::isError($db)) die($db->getmessage( )); function check_transid( $id ) global $db; $res = $db->query( "SELECT COUNT(transid) FROM transcheck WHERE transid=?", array($id) ); $res->fetchinto($row); return $row[0]; function add_transid( $id ) global $db; $sth = $db->prepare( "INSERT INTO transcheck VALUES(?, now( ) )" ); $db->execute( $sth, array( $id ) ); function get_transid( ) $id = mt_rand( ); while( check_transid( $id ) ) $id = mt_rand( ); return $id;?> Den Hack ausführen Laden Sie die Dateien auf Ihren Server hoch und verwenden Sie dann den Befehl mysql, um das Schema aus db.sql in Ihre Datenbank zu laden: mysql --user=benutzername --password=passwort mydb < db.sql Hack #55: Doppeltes Abschicken von Formularen verhindern 245

#55 Doppeltes Abschicken von Formularen verhindern Wenn Sie nun die Datei index.php in Ihrem Browser aufrufen, wird das einfache E-Commerce-Formular angezeigt, zu sehen in Abbildung 6-10. Abbildung 6-10: Das einfache E-Commerce-Formular Geben Sie ein paar Daten ein und klicken Sie auf Senden. Das Ergebnis sollte aussehen wie die Anzeige in Abbildung 6-11. Das ist ein guter Anfang, da wir offensichtlich in der Lage sind, erfolgreiche Transaktionen durchzuführen. Abbildung 6-11: Ein erfolgreicher Geschäftsabschluss Klicken Sie nun auf den Zurück-Button Ihres Browsers und schicken Sie das Formular erneut ab. Das Ergebnis sollte nun aussehen wie Abbildung 6-12. Im Verlauf dieser Transaktion fordert index.php eine einmalige ID vom Skript trans.php an. Das Skript handler.php, das die Formulardaten entgegennimmt, überprüft durch einen Aufruf der Funktion check_transid( ), ob die ID bereits in Benutzung ist. In diesem Fall sollte der Code das Ergebnis in Abbildung 6-12 zurückgeben. Befindet sich die ID noch nicht in der Datenbank, verwenden Sie die Funktion add_transid( ), um eine neue ID in die Datenbank einzufügen und dem 246 Kapitel 6: Applikationsdesign

Abbildung 6-12: Die Anzeige nach einem erneuten Abschicken des Formulars Benutzer anzuzeigen, dass die Transaktion erfolgreich war, wie in Abbildung 6-11 gezeigt. Der aufmerksame Leser wird gemerkt haben, dass hier eine Konkurrenzsituation entstehen kann. Muss zwischen dem Aufruf von check_transid( ) und add_transid( ) ein weiteres Formular bearbeitet werden, kann es zu einem doppelt abgeschickten Formular kommen, dessen Verarbeitung gültig ist. Unterstützt Ihre Datenbank gespeicherte Prozeduren (»stored procedures«), können Sie eine einzelne Prozedur schreiben, die überprüft, ob die Transaktion beendet wurde, und diese dann einer entsprechenden Liste hinzufügen. Auf diese Weise kann das Konkurrenzproblem vermieden werden, wobei gleichzeitig sichergestellt wird, dass Formulare nicht doppelt abgeschickt werden. Ab MySQL 5.0 werden auch gespeicherte Prozeduren unterstützt. Hack #55: Doppeltes Abschicken von Formularen verhindern 247