Question

Je lance un site de jeu si j'ai beaucoup d'utilisateurs connectés et ils peuvent faire certaines choses une fois toutes les deux minutes.

J'ai un système CAPTCHA dans les lieux, et pour certaines choses, il sera toujours demander un code, et pour d'autres choses, il vous demandera une fois toutes les 10 minutes.

J'ai eu certains joueurs utilisent la soumission automatique fonctionnalité sur Opera, et mon système CAPTCHA ne les arrête.

Ma question est, comment puis-je réduire le nombre de fois que je demande un code, mais toujours arrêter les personnes qui utilisent cette soumission automatique?

Était-ce utile?

La solution

Si je comprends bien cette tâche ne nécessite pas un captcha. Je suppose que vous voulez voir si l'utilisateur ne clique lui-même, assis devant son PC.

nouvelle idée

Mettre l'image multiple présente sur votre formulaire:

<input type="image" name="send1" src="buttons.php?i=1" />
...
<input type="image" name="send8" src="buttons.php?i=8" />

lors de la génération d'une forme obtenir un nombre aléatoire entre 1 et 8 et l'enregistrer dans $_SESSION['submitnumber']. créer deux images de même taille - un vide rempli de votre arrière-plan par défaut sous forme, l'autre à la recherche comme un bouton d'envoi. créer buttons.php qui images de sortie avec ce code:

header("Content-Type: image/jpeg");
flush();
readfile($filename);

et retourner l'image vide si le $_GET[i]!=$_SESSION['submitnumber'] autre de renvoyer l'image soumettre.

Acceptez le formulaire si la imagesubmit correcte a été cliqué (le navigateur envoie Vous coords comme send1X lorsque l'utilisateur clique sur le bouton)

Il est un type de captcha, mais les gens ne savent pas;)

vieille idée

Vous avez besoin de deux choses:

1 Générer des jetons pour des formes qui sont tout à fait unique.

mettre <input type="hidden" name="timertoken" value="someweirdstring" /> et générer le « someweirdstring » être un md5 de certains (nom d'utilisateur et le temps) chose -dependant. Je peux élaborer sur ce sujet, mais c'est un jeton de forme de base pour les attaques de sécurité et de blocage CSRF. Le jeton est vérifié après la publication.

exemple:

pas une mise en œuvre typique du mécanisme symbolique, mais il sera suffisant.

$token=generatesomerandomtext();
$_SESSION['token']=$token; 

//... somewhere later when outputing forms:    
echo '<input type="hidden" name="token" value="'.$token.'" />';

//and when it comes back:
if($_POST['token']==$_SESSION['token']) {
   //it's ok
   }

et c'est tout ce qu'il faut. cet exemple simple crée un jeton unique pour chaque page et met en forme. Il est pas le temps et l'utilisation dépendante ne marche pas md5, mais stocke le jeton en session. Pour envoyer automatiquement un formulaire qui serait accepté la personne doit utiliser le formulaire Vous généré ou copier le jeton.

serait plus la forme réelle exemple symbolique comme celui-ci:     $ Jeton = md5 ($ username.'some texte secret $ date timeRoundedTo10Minutes $..);

//... somewhere later when outputing forms:    
echo '<input type="hidden" name="token" value="'.$token.'" />';

//and when it comes back:
if(
 ($_POST['token']==md5($username.'some secret text'.$date.$timeRoundedTo10Minutes)) ||
 ($_POST['token']==md5($username.'some secret text'.$date.$timeRoundedTo10Minutes-10minutes)) ) {
   //it's ok
   }

Pourquoi les noms d'utilisateur? Parce qu'il élimine la possibilité d'utiliser les jetons d'un utilisateur à pirater un autre utilisateur Pourquoi texte secret (appelé « sel »)? Parce que quelqu'un pourrait coller ensemble le nom d'un autre utilisateur avec le temps et faire md5, mais sans deviner le sel, il ne peut pas. Pourquoi les deux comparaisons? Parce que si est maintenant 22:44:59 - le jeton est généré avec 22:40 et si l'utilisateur envoie son 22:45:30 il s'arrondi à 22h50 et il correspond au jeton que si vous le prenez de nouveau 10 minutes .

Que ce soit pour un exemple de base. Pour référence, voir cette question .

2 Modifier votre bouton Envoyer en <input type="image" ... comme en affiche les coordonnées x et y de l'endroit où le bouton a été cliqué. Je ne sais pas qui est venu avec cela dans la spécification, mais il est la première fois il peut être utilisé! :)

Maintenant, pour voir si l'utilisateur lui-même cliqué Il vous suffit de voir si les coordonnées sont présents (submiting classique ne pas les envoyer) et de bloquer le piratage simple, ce que vous pouvez également se rappeler la dernière x et y dans la session de joueur et comparer . Il est beaucoup plus difficile à pirater pour envoyer différents coords à chaque fois.

Les jetons de forme sont là pour empêcher les utilisateurs de préparer une copie de votre formulaire avec des champs aléatoires qui simulent les coordonnées de clic. Si le jeton change à chaque fois il est difficile de passer outre les champs de formulaire.

Ceci est encore piratable par la fonctionnalité userscript, mais il est beaucoup plus difficile. Et si vous avez ajouté un captcha une fois dans une personne d'heure serait la peine d'écriture des scripts qui pourraient aider seulement pour une heure et briser après (et nécessitent des efforts et des connaissances).

Autres conseils

Selon les données que vous recevez pouvez recueillir evidents que l'appelant est un utilisateur. Seulement demander le CAPTCHA, si l'appelant semble être un bot.

Evidents peuvent être:

  • l'agent utilisateur (non fiable, car Opera peuvent simuler cela)
  • l'intervalle l'envoi est déclenché (plus exactement l'appel touche les toutes les 2 minutes à savoir plus il est probable un bot)
  • si vos données permet de vérifier des modèles de retour, il peut être une évidence aussi
  • ...
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top