Question

J'ai récemment trouvé un énorme problème de sécurité avec mon système PM qui permet aux utilisateurs d'envoyer un message autant qu'ils veulent avec une boucle de for dans la barre d'adresse. Quelqu'un a mis cela dans la barre d'adresse:

javascript:for(x=0;x<10000;x++){ $('#compose form').submit(); }

Et le message a été envoyé 1000 fois pour moi et ma boîte de réception était pleine du même message et ma base de données était si pleine que phpMyAdmin était très étant laggy.

Ma question est, comment puis-je empêcher cela? Ceci est une grande question.

En outre, le formulaire est soumis avec AJAX.

Modifier

J'utilise PHP, alors comment puis-je empêcher cela? Par exemple, comment pourrais-je faire à l'endroit où un message ne peut être envoyé toutes les 5 minutes et si elles soumettent plus d'un à moins de 5 minutes, il affiche une erreur (ou pas présenter de commentaires des utilisateurs du tout et juste arrêter d'être soumis )?

Était-ce utile?

La solution

Il y a une façon évidente de le réparer et les mensonges de problème non sur le côté client -. il se trouve du côté du serveur

Votre script serveur ne devrait pas permettre d'envoyer des messages trop souvent - par exemple. souvent que, par exemple, une fois toutes les 10 minutes. Pour ce faire, vous pouvez utiliser le mécanisme Session sur le côté serveur et enregistrer les informations lorsque l'utilisateur a envoyé l'e-mail. Si l'utilisateur n'a pas envoyé un e-mail, vous devez également enregistrer ces informations en session -. De distinguer les personnes ayant session a permis des personnes avec la session handicapés (et vous devez bloquer celui-ci d'envoyer des e-mails à tous)

La session de manière devrait être mis en œuvre (le code spécifique) dépend de la langue que vous utilisez pour les scripts côté serveur (PHP, Python, JSP, etc.).

Autres conseils

Si quelqu'un a les connaissances nécessaires pour le faire pour vous, vous ne pouvez probablement faire quoi que ce soit du côté client de sorte que la seule option que je dirais est que vous ouvrez une session ou de conserver un nombre etc du nombre de demandes (peut-être à un particulier ressources) et de refuser la demande (ou envoyer un « occupé » le code http, etc.) pour l'utilisateur particulier.

Je pense que la façon la plus simple serait de compter les demandes provenant d'une adresse IP spécifique (ce qui a évidemment des inconvénients tels que plusieurs utilisateurs derrière un proxy ou NAT etc).

La solution réelle dépendra de votre langage côté serveur et serveur web, mais vous pouvez encadrer peut-être une règle et de voir comment cela fonctionne. Quelque chose comme 5 demandes par minute (ou tout ce qui est approprié pour votre utilisation) par adresse IP.

Comme d'autres l'ont dit, vous devez mettre en œuvre une protection sur le serveur. Aucune quantité de codage assurera la protection côté client.

La façon courante de protéger un serveur contre ce type d'abus est appelé rate limiting. Vous décidez combien de fois que vous voulez un client donné pour être en mesure de soumettre un message et vous codez le serveur d'ignorer les messages qui ne relèvent pas de cette limite.

Par exemple, vous pouvez décider que vous permettrez pas plus d'un message d'une minute et pas plus de deux messages toutes les 10 minutes et pas plus de quatre messages à l'heure. Vous choisissez ce que vous pensez semble raisonnable et votre code à cet algorithme.

Dans votre serveur, vous devriez être en mesure d'identifier quel utilisateur le message provenait de (très probablement par un cookie d'authentification) et dans votre base de données, vous devriez être en mesure de savoir quand le dernier message a été envoyé par cet utilisateur. Vous pouvez même être en mesure de mettre en cache cette information dans la RAM dans votre serveur (en fonction de la façon dont fonctionne votre serveur) afin d'éviter une recherche de base de données sur chaque demande, car il suffit de garder les informations récentes et vous avez seulement besoin d'optimiser la performance sur les récidivistes ( ceux qui essaient d'abuser de votre serveur et donc tout récemment envoyé une demande).

Je suis d'accord avec ce que chacun affichage sur limitante.

Cependant, cela peut être très compliqué à mettre en œuvre sur le côté serveur. Surtout quand vous commencez à la montée en puissance. Et, honnêtement, si 1000 messages mal si mal - ma suggestion peut demander à vous encore plus.

Au lieu de mettre en œuvre vous-même, vous pouvez regarder dans un service tiers pour le faire pour vous, comme ce super services web proxy frais Apigee

L'une de leurs fonctions est, en particulier, la limitation tarifaire de l'API. (Voir le lien)

entrer image description ici

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top