Ich betreibe eine Spielewebseite, so dass ich viele Benutzer angemeldet habe und sie können alle zwei Minuten bestimmte Dinge tun.
Ich habe ein CAPTCHA-System an einigen Stellen, und für einige Dinge wird es immer nach einem Code fragen, und für andere Dinge wird es alle 10 Minuten fragen.
Ich habe einige Spieler die Auto-Submit-Funktion in Opera verwenden lassen, und mein CAPTCHA-System stoppt sie.
Meine Frage ist, wie kann ich die Anzahl der Male minimieren, um die ich nach einem Code frage, aber immer noch Leute davon abhalte, diese automatische Übermittlung zu verwenden?
Wenn ich richtig verstehe, benötigt diese Aufgabe kein Captcha. Ich nehme an, Sie möchten sehen, ob der Benutzer selbst geklickt hat und vor seinem PC sitzt.
neue Idee
Fügen Sie mehrere Bildvorlagen in Ihr Formular ein:
%Vor% Beim Generieren eines Formulars erhalten Sie eine Zufallszahl zwischen 1 und 8 und speichern diese in $_SESSION['submitnumber']
.
Erstellen Sie zwei Bilder gleicher Größe - eine leere mit Ihrem Standardhintergrund im Formular gefüllt, die andere sieht wie eine Schaltfläche zum Senden aus.
Erstellen Sie buttons.php, das Bilder mit diesem Code ausgibt:
und geben Sie ein leeres Bild zurück, wenn das $_GET[i]!=$_SESSION['submitnumber']
else das Submit-Bild zurückgibt.
Akzeptieren Sie das Formular, wenn Sie auf den richtigen Bilder-Unterordner geklickt haben (der Browser sendet Ihnen die Koordinaten send1X, wenn der Benutzer auf die Schaltfläche klickt)
Es ist eine Art Captcha, aber die Leute werden es nicht wissen;)
alte Idee
Sie brauchen zwei Dinge:
1 Token für Formulare generieren, die ziemlich eindeutig sind.
setzen <input type="hidden" name="timertoken" value="someweirdstring" />
und erzeuge den "someweirdstring" als md5-Hash von etwas (Benutzername und Zeit) -abhängiger Sache. Ich kann das näher ausführen, aber dies ist ein Grundform-Token für die Blockierung von Sicherheits- und CSRF-Angriffen. Das Token wird nach dem Senden verifiziert.
Beispiel:
Dies ist nicht eine typische Implementierung des Token-Mechanismus, aber es wird ausreichen.
%Vor%und das ist alles, was Sie brauchen. Dieses einfache Beispiel erstellt für jede Seite ein eindeutiges Token und fügt Formulare ein. Es ist nicht zeitabhängig und verwendet nicht md5, sondern speichert das Token in der Sitzung. Um automatisch ein Formular zu senden, das akzeptiert wird, muss die Person das Formular verwenden, das Sie generiert oder das Token kopiert haben.
Das Beispiel für ein echtes Formular-Token würde eher so aussehen: $ token = md5 ($ username.some secret text '. $ date. $ timeRoundedTo10Minutes);
%Vor%Warum Benutzernamen? Weil dadurch die Möglichkeit entfällt, die Token eines Benutzers zu verwenden, um einen anderen Benutzer zu hacken Warum geheimer Text ("Salz" genannt)? Weil jemand den Namen eines anderen Benutzers mit der Zeit zusammenhalten und md5 machen könnte, aber ohne das Salz zu erraten, kann er nicht. Warum die beiden Vergleiche? Denn wenn es jetzt 22:44:59 ist - der Token wird mit 22:40 generiert und wenn der User es sendet ist es 22:45:30, also wird es auf 22:50 gerundet und es passt nur dann zum Token, wenn du es 10 Minuten zurücknimmst .
Das ist es für ein einfaches Beispiel. Zur Referenz siehe diese Frage.
2 Ändern Sie Ihre Übermittlungsschaltfläche in <input type="image" ...
, während die X- und Y-Koordinaten des Klicks auf die Schaltfläche angezeigt werden. Ich habe keine Ahnung, wer das in der Spezifikation gefunden hat, aber es ist das erste Mal, dass es verwendet werden kann! :)
Nun, um zu sehen, ob der Benutzer selbst geklickt hat. Sie müssen nur sehen, ob die Koordinaten vorhanden sind (klassisches Senden wird nicht gesendet) und um einfaches Hacking zu blockieren. Sie können sich auch das letzte x und y in der Sitzung des Spielers merken und vergleichen . Es ist viel schwieriger, es zu hacken, um jedes Mal andere Coords zu senden.
Die Formulartoken verhindern, dass Benutzer eine Kopie Ihres Formulars mit zufälligen Feldern erstellen, die die Klickkoordinaten simulieren. Wenn sich das Token jedes Mal ändert, ist es schwierig, Formularfelder zu überschreiben.
Dies ist immer noch durch Benutzer-Skript-Funktionalität hackbar, aber es ist viel schwieriger. Und wenn Sie einmal in der Stunde ein Captcha hinzufügten, würde niemand mehr daran denken, Skripte zu schreiben, die nur für eine Stunde helfen und danach eine Pause machen würden (und einige Anstrengungen und Kenntnisse erfordern).
Abhängig von den Daten, die Sie erhalten, können Sie feststellen, dass der Anrufer ein Benutzer ist. Fragen Sie nur nach dem CAPTCHA, wenn der Anrufer ein Bot zu sein scheint.
Evidenzen können sein:
Tags und Links php captcha user-presence