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

Frage Entwicklung PHP

GELÖST

Mehrfaches Absenden eines Formulars verhindern

Mitglied: Sapzero

Sapzero (Level 1) - Jetzt verbinden

01.06.2009, aktualisiert 02:46 Uhr, 8296 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
Microsoft Office
Kombinationsfeld mehrfach verwenden
Frage von PandamirMicrosoft Office1 Kommentar

Hallo, ich möchte in Word 2010 ein Kombinationsfeld/Dropdownfeld mehrfach verwenden. Ich nutze das Feld für Anreden und habe dieses ...

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 ...

Neue Wissensbeiträge
Datenschutz

Teamviewer kommt für IoT-Geräte wie den Raspberry Pi

Information von magicteddy vor 5 StundenDatenschutz

Moin, jetzt werden IoT Geräte endgültig zur Wanze? Anscheinend kann man auf einem Dashboard seine Geräte visualisieren Ich stelle ...

Microsoft

Letzte Updates für Win10 und Server2016 müssen bei Bedarf über den Update catalogue in den WSUS importiert werden!

Tipp von DerWoWusste vor 10 StundenMicrosoft1 Kommentar

automatisch kommt da nichts an im WSUS und auch nicht im SCCM. Siehe Hinweise zum Bezug der jeweils neuesten ...

Linux

Meltdown und Spectre: Linux Update

Information von Frank vor 3 TagenLinux

Meltdown (Variante 3 des Prozessorfehlers) Der Kernel 4.14.13 mit den Page-Table-Isolation-Code (PTI) ist nun für Fedora freigegeben worden. Er ...

Tipps & Tricks

Solutio Charly Updater Fehlermeldung: Das Abgleichen der Dateien in -Pfad- mit dem Datenobject ist fehlgeschlagen

Tipp von StefanKittel vor 4 TagenTipps & Tricks

Hallo, hier einmal als Tipp für alle unter Euch die mit der Zahnarztabrechnungssoftware Charly von Solutio zu tun haben. ...

Heiß diskutierte Inhalte
Netzwerkmanagement
Preis für Wartungsvertrag ok?
gelöst Frage von a-za-zNetzwerkmanagement22 Kommentare

Hallo! Mal ne Frage, weil ich mich mit dem akzeptablen Preis für einen Reaktionszeitvertrag nicht auskenne. Meine Firma hat ...

Windows Netzwerk
Ist ein Portforwarding auf einen PC ohne lauschendes Programm ein (großes) Sicherheitsproblem?
Frage von PluwimWindows Netzwerk13 Kommentare

Hallo zusammen, zur Fernwartung eines Rechners an einem anderen Ort nutze ich VNC. Da dieser Rechner einfach nur eine ...

Windows Server
Terminal Server 2016 erkennt Berechtigungen nicht
gelöst Frage von Thomas2Windows Server10 Kommentare

Hallo Administratoren, folgendes Problem stellt sich dar: Es gibt zwei Windows Server 2016, die als Terminal Server fungieren. Jetzt ...

SAN, NAS, DAS
Wer kennt sich mit QNAP und CISCO aus ?
gelöst Frage von MachelloSAN, NAS, DAS10 Kommentare

Hallo Zusammen hier im Forum, Ich habe ein QNas 451+ und dieses NAS hat zwei GBit Lan Adapter die ...