Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

gelöst Mehrfaches Absenden eines Formulars verhindern

Mitglied: Sapzero

Sapzero (Level 1) - Jetzt verbinden

01.06.2009, aktualisiert 02:46 Uhr, 8365 Aufrufe, 4 Kommentare

Hallo,
ich hab eine Lösung gesucht um ein mehrfaches Abschicken eines Formulas durch Aktualisieren des Browsers oder Backtaste zu verhindern.
Dies habe ich so gelöst und es funktioniert:

01.
Datenbank verbunden --> 
02.
Tabelle erstellt mit ID,Text,Datum --> 
03.
 
04.
<form name="formular" action="#" method="post"> 
05.
<textarea name="text" cols="50" rows="4"></textarea> 
06.
<input name="send" style="margin-left: 10px" type="submit" value="Send" /> 
07.
<input name="hidden" type="hidden" value="<?= uniqid(""); ?>"> 
08.
</form> 
09.
 
10.
$text = $_POST['text']; 
11.
$hidden = $_POST['hidden']; 
12.
 
13.
if(isset($_POST['send'])) 
14.
15.
	if($_SESSION["hidden"] != $_POST["hidden"]) 
16.
17.
		$_SESSION["hidden"] = $_POST["hidden"]; 
18.
		if(strlen($_POST['text']) > 0) 
19.
		{	 
20.
			$news = "INSERT INTO tblTest VALUES ('','$text',now())"; 
21.
			mysql_query($news) OR DIE ("Fehler beim Einfügen in die Tabelle:<br/ >".mysql_error()); 
22.
			echo "Text erfolgreich eingefügt!!!<br><br>"; 
23.
24.
		else 
25.
26.
			echo "Ihr Text ist zu kurz!!!<br><br>"; 
27.
28.
29.
	else 
30.
31.
		echo "Mehrfaches einfügen verhindert!!!<br>"; 
32.
33.
}
Jedoch habe ich gelsen man sollte die ID in eine Datenbank speichern und dazu noch die aktuelle Zeit mit speichern.
Jetzt zu meiner Frage ist dies notwendig oder reicht auch meine Version?
Sollte ich noch was zu meinem Code ergänzen?
Oder gibt es noch besser/sichere Lösungen?

Ich würde mich auf eine schnelle Antwort freuen

Gruß

Sapzero
Mitglied: dog
01.06.2009 um 03:47 Uhr
Was möchtest du denn nun verhindern?
Dass dein Formular mehrfach abgesendet wird, oder dass es mehrere identische Datensätze gibt?
Das sind zwei verschiedene Paar Schuhe.

Ich gehe mal aus, dass es bei deiner Lösung mit der uniqid() noch mehr Code gibt, als du uns hier zeigst - dann wäre das als CSRF-Schutz und gegen mehrfaches Absenden durchaus ausreichend (Zusätzlich sollte man dem Benutzer aber auch visuell zeigen, dass sein Formular abgesendet wurde).

Gegen Datenbankduplikate helfen aber nur Gegenprüfungen und UNIQUE-Constraints...

Und dann gibt es in deinem Code noch eine klassische SQL-Injection-Lücke...

Grüße

Max
Bitte warten ..
Mitglied: Sapzero
02.06.2009 um 00:13 Uhr
Hallo,
danke für deine Antwort.
Also ich wollte eigentlich nur verhindern das es nicht mehrere identische Datensätze gibt.
Das war auch der ganze Code ich hab euch nichts vorenthalten nur halt noch die Datenbank verbindung und die Erstellung der Tabelle.

Du sagtest, dass es ein Unterschied sei ein mehrfaches Absenden zu verhinden und doppelte Einträge zu verhindern.
Wo ist der Unterschied und wieso verhindert man mehrfaches Absenden eines Formulars?

Und könntest du mir noch sagen wo die SQL-Injection-Lücke ist?
Ich würde jetzt sagen bei $_POST['text'] oder?

Gruß

Sapzero
Bitte warten ..
Mitglied: dog
02.06.2009 um 02:12 Uhr
Also ich wollte eigentlich nur verhindern das es nicht mehrere identische Datensätze gibt.

Dann musst du dein Datenbank-Schema entsprechend anpassen und evtl. noch einmal mit PHP kontrollieren, dass keine Duplikate entstehen.

Wo ist der Unterschied und wieso verhindert man mehrfaches Absenden eines Formulars?

Das hast du doch schon selbst geschrieben:

durch Aktualisieren des Browsers oder Backtaste zu verhindern.

Abgesehen davon gibt es auch durchaus noch sicherheitsrelevante Gründe. Siehe dazu: CSRF

Und könntest du mir noch sagen wo die SQL-Injection-Lücke ist?

Hier:
01.
 $news = "INSERT INTO tblTest VALUES ('','$text',now())"; 
Das war auch der ganze Code

Das passt so aber nicht.
Der Ablauf mit uniqid() muss folgender sein:

  • uniqid() erzeugen und in SESSION-Variable speichern
  • erzeugte Variable in Formular einbauen
  • Nach dem Absenden die alte uniqid auf Gültigkeit prüfen und danach gleich eine neue erzeugen

Hier ist mal beispielhaft eine kurze Implementation:
01.
<?php 
02.
 
03.
	/** Allgemeine Funktionen zu uniqid()s 
04.
	 * ==================================== 
05.
	 * create_new_key() -> erzeugt eine neue uniqid() und sichert die alte <bei jedem seitenaufruf> 
06.
	 * check_key() -> prüft die alte uniqid() <für abgesendete formulare> 
07.
	 * current_key() -> die aktuelle uniqid() <beim erzeugen von formularen> 
08.
	 */ 
09.
	 
10.
	function create_new_key() 
11.
12.
		$_SESSION['_oldkey'] = @$_SESSION['_newkey']; 
13.
		$_SESSION['_newkey'] = uniqid(); 
14.
15.
	 
16.
	function check_key($key
17.
18.
		return ($key === @$_SESSION['_oldkey']); 
19.
20.
	 
21.
	function current_key() 
22.
23.
		return $_SESSION['_newkey']; 
24.
25.
 
26.
	//Um $_SESSION zu benutzen muss es eine aktive Session geben 
27.
	session_start();  
28.
	//Die Funktion erzeugt erstmal die uniqids(); 
29.
	create_new_key(); 
30.
	//folgender Code wird nur ausgeführt, wenn das Formular abgesendet wurde 
31.
	if (isset($_POST['frm_sent'])) { 
32.
		//Den alten Key gegen den gesendeten (=der alte) prüfen 
33.
		if(!check_key($_POST['frm_sent'])) 
34.
			die("Das Formular ist nicht mehr gültig!"); 
35.
36.
?> 
37.
<html><body> 
38.
	<form action="#" method="post"
39.
		<p> 
40.
			<input type="hidden" name="actionkey" value="<?php echo current_key() ?>" /> 
41.
			<input type="submit" value="Absenden" name="frm_sent" /> 
42.
		</p> 
43.
	</form> 
44.
</body></html>
Grüße

Max
Bitte warten ..
Mitglied: Pyradur
07.05.2011 um 23:51 Uhr
Hallo Max,
vielen Dank für Dein ausführliches Beispiel das sehr hilfreich für mich war.

Wenn ich nicht irre hat sich in Zeile 33 ein Fehler eingeschlichen.

Zeile 33 sollte lauten: if(!check_key($_POST['actionkey']))

An Stelle von Zeile 34 habe ich folgenden Code eingefügt, durch den
der Aufruf des aktuellen Formulares ohne Übergabeparameter wie POST oder GET erfolgt:

header("Location: ".$_SERVER[PHP_SELF]);

In meinem Fall war dies sinnvoll da es sich um eine Tabelle mit Eingabemöglichkeiten handelte.
So wurde die Tabelle einfach erneut angezeigt ohne dass ungewollte Änderungen stattfanden.

Gruß
Reinhold

(Besser spät als nie)
Bitte warten ..
Ähnliche Inhalte
Outlook & Mail
Outlook mehrfach öffnen - Exchange?
Frage von koehneOutlook & Mail6 Kommentare

Hallo, ich weiß, dass man Outlook nicht mehrfach öffnen darf wenn man normale PST Dateien einsetzt. Da bei einer ...

Windows Server
Drucker mehrfach vorhanden
gelöst Frage von raba34Windows Server9 Kommentare

Hallo ihr alle, ich füge Drucker mit "Erstellen" und dann (für den Standarddrucker) mit "Aktualisieren" hinzu. Wenn ich in ...

Outlook & Mail

Alle Anlagen sperren + Email an den Absender

gelöst Frage von ITplusOutlook & Mail9 Kommentare

Auf Grund von unvorsichtigen Mitarbeitern bin ich am überlegen bei einem Kunden eine Lösung umzusetzen, bei der alle Anlagen ...

E-Mail

Absender vor dem senden von postfix ändern

gelöst Frage von Web-SpiritsE-Mail1 Kommentar

Hallo, ich habe folgendes vor: die zwei Email Konten, benutzer1@domain.tld benutzer2@domain.tld sollen nach aussen im header nicht mehr zu ...

Neue Wissensbeiträge
Windows 10

Microcode-Updates KB4090007, KB4091663, KB4091664, KB4091666 für Windows 10

Information von kgborn vor 1 StundeWindows 101 Kommentar

Kurze Information für Administratoren von Windows 10-Systemen, die mit neueren Intel CPUs laufen. Microsoft hat zum 23. April 2018 ...

iOS
Updates für Iphone und Co
Information von sabines vor 5 StundeniOS

Gestern abend ist iOS 11.3.1 erschienen, ein kleineres Update, dass einige Lücken schließt und "Lahmlegen" nach einem Display Tausch ...

Windows 7

Windows 7 - Server 2008 R2: Exploit für Total Meltdown verfügbar

Information von kgborn vor 1 TagWindows 7

Kleine Information für Administratoren, die für die Updates von Windows 7 SP1 und Windows Server 2008 R2 SP1 verantwortlich ...

Sicherheit

Zero Day-Schwachstelle im Internet Explorer - wird von APT bereits ausgenutzt

Information von kgborn vor 1 TagSicherheit

Im Kernel des Internet Explorer scheint es eine Zero Day-Lücke zu geben, die von staatlichen Akteuren (APT) im Rahmen ...

Heiß diskutierte Inhalte
C und C++
Frage1 C Programmierung-Makefile Frage2 PHP-Programmierung HTTP-Fehler 404
Frage von KatalinaC und C++28 Kommentare

Hallo, ich habe 2 Fragen, die nichts miteinander zu tun haben aber mit denen ich mich gerade beschäftige: 1. ...

LAN, WAN, Wireless
Watchguard T15 VPN Einrichtung
gelöst Frage von thomasjayLAN, WAN, Wireless25 Kommentare

Hallo zusammen, wir möchten gerne über unsere Watchguard T15 einen VPN-Tunnel (Mobile VPN with IPSec) einrichten! Als Client nutzen ...

DSL, VDSL
ISP Wechsel auf Vodefone Koax, Gebäudeverkabelung nur per Cat 7
gelöst Frage von wusa88DSL, VDSL19 Kommentare

Hallo Zusammen, ich bin momentan bei Mnet als Glasfaser Kunde und möchte Preis/Leistungs-Technisch zu Kabel Deutschland / Vodafone wechseln. ...

Hyper-V
HyperV DC + DNS + AC
gelöst Frage von HardstylesHyper-V16 Kommentare

Hallo kann mir jemand sagen wieso meine Domänen Computer kein Internetzugang erhalten? Ich hab hier ein Server wo die ...