Doppelposts mit Safari vermeiden

M

meocrisis

Mitglied
Thread Starter
Dabei seit
01.08.2007
Beiträge
83
Reaktionspunkte
1
Hallo,

ich habe in meinem Forum Probleme die Doppelposts einiger User zu vermeiden. ich würde gerne nach dem submit den submit-button deaktivieren.
das geht an sich ja ganz einfach mit

onClick="return SubmitForm(); this.disabled=true;"

leider geht das aber bei safari nicht. dort wird der button deaktiviert OHNE das Formular abzusenden! ich habe bereits mehrere weg versucht (befehl in die submitform() eingebettet, andere eventhandler probiert) aber nichts bringt wirklich hilfe...

habt ihr noch einen rat?

firefox geht prima, IE konnte ich grad nicht testen...verhält sich aber laut Userbeschwerden genauso....

danke und grüße!

.meo
 
wie sieht denn die 'SubmitForm()' aus?
Zumal ich das icht über den Clienten, sondern Serverseitig klären würde.
Zum Beispiel, indem nur alle 5 Sekunden ein Post möglich ist.
(Auf die Art und Weise hätte man dann auch eine Art (Grundlage für einen) Spamschutz)
 
ich würde auch somuniums Vorschlag präferieren, zumal bei dieser Zeile:

onClick="return SubmitForm(); this.disabled=true;"

ja nicht ganz klar ist was passieren wird. Wird der Submit ausgeführt ( und somit ein neuer HTTP-Request gestartet oder wird dieser beibehalten und dort der Button disabled? Es mag sein das sowas geht, das das aber nicht sehr robust ist will ich glauben.
 
onClick="return SubmitForm(); this.disabled=true;"

Theoretisch kann das nicht funktionieren und ich glaube nicht dass das in IE, Firefox, Safari oder einem anderen Browser funktionieren kann. Die zweite Anweisung wird niemals ausgeführt, da die erste Anweisung ein return enthält.

Wenn, dann anders herum.
Code:
onClick="this.disabled=true;return SubmitForm();"
Was jedoch auch nicht 100%ig schön wäre, da im Falle eines Fehlers (wenn SubmitForm() false zurückliefert) der Nutzer das Formular nicht nochmals absenden kann. Der richtige Ort für diese Anweisung wäre durchaus die Funktion SubmitForm(). Dort kannst Du natürlich nicht die Zeile "this.disabled=true" verwenden, da in der Funktion this keine Referenz auf den Button ist.

Das wäre aber dann nur die halbe Miete. Man kann das Formular i.d.R. ja auch per Enter-Taste absenden und benötigt den Button garnicht. Es sollte also in der Funktion SubmitForm() auch direkt geprüft werden ob das Formular schon abgesendet wurde und bei Zutreffen false zurückgeliefert werden. Das kann man ja leicht umsetzen indem man eine globale Variable setzt/prüft.

Eine Sicherung im Foren-Code sollte aber mindestens noch dazukommen. Die meisten Foren-Systeme bieten auch eine Flood-Control, so dass man nur alle X Sekunden einen Beitrag einstellen kann. Schau mal in den Einstellungen nach.
 
  • Gefällt mir
Reaktionen: gishmo
Hallo und vielen Dank erstmal für eure Ratschläge!

bei onClick="this.disabled=true;return SubmitForm();" wird bei einem klick zuerst der button deaktiviert und dann kann das formular nicht mehr abgeschickt werden. hatte das schon so probiert.

die submitforum() in der bb.js.php sieht so aus:
HTML:
function submitForm() {

submitme=1;

formname=document.postform.sb_authorname.value;
if ((formname.length<1)) {
alert("You forgot to enter your name");
submitme=0;
}

formmail=document.postform.email.value;
if ((formmail.length<1)) {
alert("You forgot to enter your email");
submitme=0;
}
formsubject=document.postform.subject.value;
if ((formsubject.length<1)) {
alert("You forgot to enter a subject");
submitme=0;
}

if (submitme>0) {
// var message = document.postform.message.value;
// message = message.replace(/</g,"&lt;");
// message = message.replace(/>/g,"&gt;");
// document.postform.message.value = message;

//change the following line to true to submit form

return true;

}else{
return false;
}
}


das board ist ein joomlaboard welches leider nicht mehr weiterentwickelt wird. es gibt zwar bereits nachfolger, allerdings ist es ein imenser aufwand das ganze wieder ans design anzupassen. daher wollte ich da selber mal hand anlegen....

die floodkontrolle ist aktiviert und steht bei 20. das heisst es darf nur alle 20 sekunden gepostet werden...

grüße!
meo
 
Zuletzt bearbeitet:
Versuche mal folgendes:
Code:
[COLOR="Green"]var submitme=1;[/COLOR]
function submitForm([COLOR="Green"]button[/COLOR]) {

[COLOR="Green"]var submitButton=button;[/COLOR]

[COLOR="Red"]//submitme=1; <- löschen[/COLOR]

formname=document.postform.sb_authorname.value;
if ((formname.length<1)) {
alert("You forgot to enter your name");
submitme=0;
}

formmail=document.postform.email.value;
if ((formmail.length<1)) {
alert("You forgot to enter your email");
submitme=0;
}
formsubject=document.postform.subject.value;
if ((formsubject.length<1)) {
alert("You forgot to enter a subject");
submitme=0;
}

if (submitme>0) {
// var message = document.postform.message.value;
// message = message.replace(/</g,"&lt;");
// message = message.replace(/>/g,"&gt;");
// document.postform.message.value = message;

[COLOR="Green"]window.setTimeout(function(){
   submitButton.disabled=true;
},50);
submitme=0;
[/COLOR]

//change the following line to true to submit form
return true;

}else{
return false;
}
}
Und dann so aufrufen:
Code:
onClick="return SubmitForm([COLOR="Green"]this[/COLOR]);"

Was ich geändert habe:
-Die Variable submitme ist nun global und wird beim Absenden auf 0 gesetzt.
-Der Funktion wird eine Referenz auf den Button übergeben.
-Das "Disable" wird per Timeout 50 Millisekunden nach dem Absenden des Formulars ausgeführt. Da Du ja schreibst dass das Formular sonst im Safari nicht abgesendet wird.
 
ein wahrer Held! Es geht!
Vielen Dank! Du glaubst gar nicht wieviel Arbeit du mir dadurch erspart hast!

grüße!
.meo
 
Wäre es nicht wesentlich sinnvoller das ganze auf Serverseite abzufangen?
 
sag mir wie/ansatz und du bist mein freund! ;o)
es hat irgndwie schon wieder einer ein doppelpost hinbekommen. obwohl ich doppelposts provozieren wie sau und bekomme keinen mehr hin....

grüße!
meo
 
Hm. Kannst Du Posten, wenn JavaScript ausgeschaltet ist?
Wenn ja, schalte JavaScript aus, und du kannst Doppelposten, wie Du Lustig bist.

Ums Serverseitig mit PHP zu lösen würde ich bei der Datei und Routine, welche das Posten Regeln am Anfang einfach die aktuelle Zeit in die Session schreiben und prüfen, ob der letzte Aufruf dieser Routine schon n Sekunden her ist. Wenn nicht, bricht das Script einfach ab/gibt ne Meldung raus.
 
Du sprichst vom so genannten Race-Problem.

Gelöst wird dies auf der Serverseite mittels eines Token, z.bB. ein Counter oder ein Timestamp, der im Request mitgesendet wird und serverseitig geprüft wird. Jeder angenomme Request verändert den Token, so brauchst Du nur den Token im Request mit dem auf der Serverseite vergleichen. Bei Gleichheit ist alles ok, wenn der Token nicht gleich ist, hast Du einen Doppelpost.

Oh, nicht genau gelesen, somumium hat die Lösung schon gepostet ... :)

Client-seitig kannst Du dies mit einer JavaScript-Variable lösen. Vor dem Submit prüfen, ob die Variable gesetzt ist oder nicht. Wenn Du den Submit versendest, setzt Du die Variable und verhinderst damit ein erneutes versenden. Diese Lösung ist allerdings aus bereits erwähnten Gründen suboptimal.
 
Zurück
Oben Unten