Refreshen nach dem Absenden eines Formulars verhindern.

Bei der Verarbeitung eines Formulars, als Beispiel ein Kontaktformular, möchte man zwingend vermeiden, dass der User dieses Formular mehrmals versendet (Refresh im Browser mit F5).

Den Effekt kann sich jeder vorstellen. Mails, die mit einem Formular versendet werden, erhält man auf ein mal sehr oft. Wenn ich mir dann vorstelle, dass jemand F5 gedrückt hält, ist wirklich alles vorbei. Die Folgen können sehr unangenhem werden.

Sicherlich gibt es mehrere Varianten um dieses Verhalten zu unterbinden. Oft sieht man, dass eine Umleitung nach dem Absenden des Formulars erfolgt. Diese Lösung finde ich Persönlich nicht so gut, auch kann man diese umgehen. Andere verwenden wiederum eine Zeitsperre, sprich Formulare können nur alle X Sekunden von einem User versendet werden. Diese Einschränkung gefällt mir ebenfals nicht.

Da ich mit Simon gerne über Lösungen für solche dinge diskutiere, ist dabei eine interessante Lösung rausgekommen.

Meine Anforderungen sind die, dass es ziemlich einfach sein muss, dies in ein Formular zu integrieren. Man hat ja sehr oft Formulare. 🙂 Weiterhin sollen keine Usereingaben nötig sein, wie es z.b. bei einem Captcha der Fall ist. Auch das Erstellen eines Randomstrings, um diesen dann in dem Formular mitzuschleppen, finde ich nicht so praktisch. Gerade wenn man Formulare über GET versendet.

Die Idee war es, aus allen Inputfeldern einen Hashwert zu erstellen und diesen in der Session zu speichern. Wenn der Hashwert gleich ist, dann wurde der Refreshbutton (F5) gedrückt. Der User, der einen ärgern will, muss sozusagen immer den Inhalt des Formulars anpassen.

Da ich eigentlich nur noch in einer OOP-Umgebung arbeite, gibt es dafür auch eine Klasse. 🙂

 /**
 * @author Creator
 * @version 0.1
 *
 */
class Killrefresh {

	/**
	 * Prüft ob das Formular versendet wurde.
	 * Liefert true zurück wenn das Formular schon versendet wurde, false wenn es noch nicht versendet wurde.
	 *
	 * @param String $methode
	 * @return Bool
	 */
	public static function checkRefresh($methode){
		if(!isset($_SESSION)){ session_start(); }
		$string = '';
		if (isset($_SESSION['anti_refresh'])) {
			switch ($methode){
				case 'post':
					foreach ($_POST AS $post){
						$string .= $post;
				}
			break;
				case 'get':
					foreach ($_GET AS $get){
						$string .= $get;
				}
			break;
			}
			if ($_SESSION['anti_refresh'] == md5($string)) {
				return true;
			}
			else {
				return false;
			}
		}
		else {
			return false;
		}
	}

	/**
	 * Speicher einen Hashwert in der Session
	 *
	 * @param String $methode
	 */
	public static function setCheckString($methode){
		if(!isset($_SESSION)){ session_start(); }
		$string = '';
		switch ($methode){
			case 'post':
				foreach ($_POST AS $post){
					$string .= $post;
				}
			break;
			case 'get':
				foreach ($_GET AS $get){
					$string .= $get;
				}
			break;
		}
		$_SESSION['anti_refresh'] = md5($string);
	}
}
?>

Die Anwendung ist wirklich einfach.

Beispiel:

< ?php
if (!Killrefresh::checkRefresh('post')) {
// Formular verarbeiten
// Dann den Prüfstring setzten.
Killrefresh::setCheckString('post');
}
else {
// Formular nicht mehr verarbeiten
}
?>

Die Methoden müssen nur wissen über welche Methode das Formular versendet wurde also ob es POST oder GET ist.

Wie Ihr weiter verfahren wollt, wenn es ein Refresh ist, bleibt jedem selbst überlassen. Ich zeige meistens das Formular einfach an mit einer Meldung.

1 Star2 Stars3 Stars4 Stars5 Stars (5 Stimme, durchschnittlich 4,80 / 5)
Loading...


Hinterlasse einen Kommentar!

Time limit is exhausted. Please reload the CAPTCHA.

»Informationen zum Artikel

Autor: Creator
Datum: 20.05.2009
Zeit: 16:19 Uhr
Kategorien: Codeschnipsel
Gelesen: 5016x heute: 3x

Kommentare: RSS 2.0.
Diesen Artikel kommentieren oder einen Trackback senden.

»Meta