Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

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

Frage Entwicklung PHP

Mitglied: Sapzero

Sapzero (Level 1) - Jetzt verbinden

01.06.2009, aktualisiert 02:46 Uhr, 7884 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 ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Windows 10
gelöst Herunterfahren RDP Windows 10 verhindern (4)

Frage von micha055 zum Thema Windows 10 ...

Exchange Server
gelöst Vererbung von Berechtigungen auf Unterordner in Outlook verhindern (6)

Frage von touro411 zum Thema Exchange Server ...

Windows 10
gelöst Windows 10 - Automatischen Reboot sicher verhindern (2)

Frage von yakini zum Thema Windows 10 ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (29)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...