2009-04-26 4 views
2

Ich baue eine Website mit Ubuntu, Apache und Django. Ich möchte Personen daran hindern, ein bestimmtes Formular auf meiner Website mehr als einmal auszufüllen und einzureichen. Ich weiß, dass es ziemlich unmöglich ist, einen bestimmten Benutzer daran zu hindern, seine IP-Adresse zu ändern, seine Cookies zu löschen und so weiter; alles, was ich suche, ist etwas, das den gelegentlichen Benutzer davon abhalten wird, sich erneut zu bewerben.Wie kann ich Personen daran hindern, ein Formular absichtlich erneut zu senden?

Es scheint mir, dass das Blockieren von Mehrfachformularübermittlungen von der gleichen IP-Adresse der beste Weg ist, um zu erreichen, nach was ich suche. Ich bin mir jedoch nicht sicher, wie ich das machen soll und ob ich das von Apache oder von Django machen soll. Irgendwelche Tipps?

Bearbeiten: Ich bin auf der Suche nach absichtlichen erneuten Einreichung, nicht nur unbeabsichtigte doppelte Einreichung. z.B. Ich habe eine Umfrage, bei der ich die Leute davon abhalten soll, mehrmals zu wählen.

Antwort

3

Mehrere ganze Länder sind NAT, und einige (auch?) Große multinationale Unternehmen, viele mit jeweils mehreren hunderttausend Benutzern. Alles per IP zu blockieren ist eine schlechte Idee.

Gehen Sie stattdessen auf einen Keks, der so gut ist wie er wird. Sie können auch den Benutzer anmelden, in welchem ​​Fall Sie wissen würden, ob das Formular wiederholt für diesen Login eingereicht wurde.

+0

Dank krosenvold. Wenn also ein Land NAT-basiert ist, zeigen alle Besuche aus diesem Land dieselbe IP-Adresse? Wo finde ich Informationen darüber, welche Länder/Gebiete NAT sind? – RexE

+0

Nun, sie teilen nicht eine * einzige * IP-Adresse, die wahrscheinlich zu begrenzt wäre. Erwarte etwas wie ein oder mehrere Klasse-C-Netzwerke für ein ganzes Land. Soweit ich weiß, sind Singapur und Thailand NAT. Ich weiß nicht, ob es eine koordinierte Quelle dieser Information gibt; und die Dinge können sich auch ändern;) – krosenvold

1

Ich würde die Sitzungs-ID verwenden und Formularübermittlungen in einer Tabelle mit Sitzungs-ID, Zeitstempel und optional einer Art Formularbezeichner speichern. Wenn ein Formular abgeschickt wird, können Sie die Tabelle überprüfen, um sicherzustellen, dass es innerhalb eines bestimmten Zeitraums nicht stattgefunden hat.

1

Filterung auf IP-Adresse und/oder Cookies sind beide leicht zu umgehen, aber sie werden verhindern, dass der gelegentliche Benutzer versehentlich das gleiche Zeug mehrmals wegen Browser-Hick-ups, Ungeduld und so weiter einreichen.

Wenn Sie etwas besser als das möchten, können Sie Login implementieren, aber natürlich verhindert das viele Benutzer zu reagieren.

1

Fügen Sie dem Formular eine monoton steigende ID-Nummer in einem versteckten Feld hinzu.

Während jedes Formular eingereicht wird, notieren Sie die ID in einer "verwendeten" Liste/Karte (oder markieren Sie es verwendet, oder was auch immer, Implementierungsdetail).

Wenn Sie die gleiche ID ein zweites Mal erhalten (wenn es bereits in Ihrer verwendeten Karte ist), informieren Sie den Benutzer, der sie doppelt eingereicht hat.

1

Während nichts narrensicher ist, würde ich Folgendes vorschlagen: Wenn ein Benutzer die Seite mit Ihrem Formular lädt, wird ein Cookie gesetzt und dem Wert des Cookies wird eine feste geheime Zeichenfolge und der Wert md5 angehängt Dies wird in ein verstecktes Feld auf dem Formular geschrieben. Stellen Sie sicher, dass bei jedem Zugriff des Benutzers auf das Formular ein neuer Wert generiert wird.

Wenn der Benutzer das Formular absendet, überprüfen Sie, ob der Cookie-Wert und der Formularwert übereinstimmen, dass das Cookie des Benutzers nicht zum Absenden des Formulars verwendet wurde und dass die Referrer-ID der URL des Formulars entspricht. Optional stellen Sie sicher, dass es in den letzten 2 Minuten keine Versuche gegeben hat, von dieser IP aus zu posten (schnell genug, dass es für die meisten Leute nicht wichtig ist, aber langsam genug, um Bots zu verlangsamen).

Um dies zu beheben, muss der Benutzer ein Skript erstellen, das die Seite lädt, die Cookies speichert und die korrekten Werte übermittelt. Dies ist viel schwieriger, als wenn der Benutzer das Formular einfach abschicken könnte.

Hinzugefügt Basierend auf bearbeiten: Ich würde die Benutzer im Django-Framework blockieren. Auf diese Weise können Sie dem Benutzer eine viel bessere Fehlermeldung anzeigen, und Sie blockieren sie nur von diesem Formular.

+0

Danke tomjen für die nachdenkliche Antwort. Würde ich IP-Adressen von meinem Django-Code oder von Apache blockieren? – RexE

4

Wenn es Ihr Hauptanliegen ist zu verhindern, dass jemand ein Skript schreibt und das Formular automatisch mehrmals abschickt, möchten Sie möglicherweise CAPTCHA mit Ihrem Formular verwenden.

1

Dies ist eine Frage der Authentifizierung und Autorisierung, die verwandt aber nicht identisch sind. Um die Autorisierung zu verwalten, müssen Sie zuerst den Benutzer authentifizieren (zuverlässig identifizieren).

Wenn Sie möchten diese vorsätzliche Missbrauch machen wider dann Sie nicht nur mit Benutzernamen und Passwörter, um am Ende gehen, sondern verlangt nach Informationen, die persönlich Ihre Benutzer identifiziert, nach dem Vorbild der Dinge eine Bank fragt nach, wenn Sie Ich möchte ein Konto eröffnen. Die blutenden Herzen und Linkshänder werden endlos über die Verletzung der Privatsphäre hadern, aber tatsächlich machen Sie genau das gleiche wie eine Bank und aus genau den gleichen Gründen.

Es ist eine Menge Arbeit und kann vom Gesetz betroffen sein. Willst du das wirklich machen?

1

Die folgenden Methoden sind alle relativ einfach, sowohl um zu implementieren und zu hacken. Jeder mit Firebug und ein wenig Wissen wird nicht einmal blinzeln.

Das folgende Javascript verwendet Mootools, und ich habe es nicht überprüft, um fehlerfrei zu sein. Ich verstehe, dass JQ-Syntax fast identisch ist, und rohe JS ist ähnlich genug, so dass der Punkt klar sein sollte.

1) Wenn das Formular über AJAX gesendet wird, können Sie vor dem Einreichen überprüfen (Entschuldigung, wenn ich nur das Offensichtliche sage).

var sent = 0; 
$('myForm').addEvent('submit', function(){ 
    if(!sent) this.send(); 
}) 

Dies ist wirklich einfach und überraschend effektiv, bis sie die Seite neu laden.

2) Fügen Sie ein Javascript-Cookie hinzu. Wieder mit Mootools:

$('myForm').addEvent('submit', function(){ 
    if(Cookie.read('submitted')){ alert('once only'); return false;} 
    else{ Cookie.write('submitted', 1); return true; } 
}) 

Dies funktioniert selbst dann, wenn der Benutzer die Seite neu geladen.

3) Fügen Sie ein Python-Session-Cookie hinzu. Ich bin nicht vertraut mit Python, aber wenn es wie PHP ist, hat dies keinen Vorteil gegenüber Methode 2. In beiden Fällen kann der Benutzer das Cookie mit FireCookie oder WebDeveloper Toolbar (oder deren Äquivalenz in anderen Browsern) löschen und neu laden Seite.

4) Fügen Sie ein Flash-Cookie hinzu (verwenden Sie Flex). Dies ist ideal - Flash-Cookies sind an einem anderen Ort gespeichert, sind nicht offensichtlich und sind sehr schwer zu entfernen. Der einzige Nachteil ist, dass Sie ein kleines SWF erstellen und einbetten müssen.

5) Speichern Sie einen Wert in einem versteckten Feld und prüfen Sie den Wert. Den internen Links kann ein Hash hinzugefügt werden, um sicherzustellen, dass der Wert auch dann erhalten bleibt, wenn von der Seite weg navigiert wird.

6) Bei anderen Spielen kann für jeden Besucher eine URL (oder eine benutzerdefinierte URL mit htaccess) inkrementiert werden.

Ein swf Cookie ist die beste Idee des oben genannten, obwohl es mit den anderen kombiniert werden kann. Viel Glück.

Verwandte Themen