Comment puis-je empêcher un utilisateur expérimenté d'appeler mes fonctions ajax?

12

J'ai un site qui utilise les appels ajax pour effectuer un certain nombre de fonctions. Ils font rappeler le navigateur Web à un script - ajax.php. Bien que j'utilise des données post pour transmettre les données et limiter les commandes que le script ajax peut appeler, rien n'empêche vraiment les utilisateurs d'usurper les appels ajax pour tenter de manipuler le site. Existe-t-il un moyen général d'empêcher les utilisateurs d'usurper les appels? Existe-t-il un moyen de s'assurer qu'un appel ajax provient bien de mon site Web et non d'un autre script ou site?

Ou dois-je simplement vérifier les conditions aux limites dans le script php et empêcher les utilisateurs d'usurper des choses qu'ils ne seraient pas autorisés à faire, mais leur permettre d'usurper où ils seraient autorisés.

Daniel Bingham
la source
Les appels ajax sont-ils complètement non authentifiés? Créez-vous des sessions pour chacun? Y a-t-il des modèles d'abus? Et le problème est-il lié aux manipulations ou à la quantité de charge qu'il ajoute au site?
artlung
Pouvez-vous publier plus de détails s'il vous plaît? Que font les appels AJAX? Que manipulent-ils? Quels problèmes se produisent si le script est appelé en dehors d'AJAX?
DisgruntledGoat
Je ne demande pas vraiment une circonstance spécifique, mais plutôt une solution générale applicable à de nombreuses circonstances. S'il existe une telle solution, ce qui ne semble pas exister.
Daniel Bingham

Réponses:

12

Je ne pense pas qu'il existe un moyen de le faire de manière fiable, car toute information que vous pourriez envoyer pourrait être falsifiée, en fonction de l'habileté de l'utilisateur.

Si vous voulez juste un simple bloc de personnes qui n'appellent pas depuis votre page, alors vous pouvez vérifier le référent, utiliser un cookie ou ajouter un champ caché aléatoire envoyé par la page appelante qui expire après un certain temps. Mais ceux-ci sont faciles à usurper si l'utilisateur est vraiment déterminé.


la source
2
+1 .. tout comme il est impossible d'empêcher les utilisateurs d'enregistrer des copies locales de tout ce que leur navigateur affiche. C'est plus un concours pour voir si vous pouvez les faire abandonner et passer à autre chose avant de le découvrir.
Tim Post
6

Bref, non. Toute demande adressée à une URL via GET ou POST peut être effectuée par toute personne utilisant un logiciel. En fait, une demande AJAX n'est vraiment pas différente du chargement direct de l'URL, sauf qu'avec ce dernier, les données renvoyées sont affichées dans le navigateur comme une page Web.

C'est exactement la raison pour laquelle vous devez toujours valider les données soumises sur le serveur, que vous fassiez ou non une validation Javascript.

On ne sait pas exactement ce que fait le script côté serveur et ce qui pourrait mal se passer, mais si les utilisateurs sont capables de "manipuler le site" en appelant votre script avec de mauvaises données, alors vous vous trompez.

La meilleure solution sera probablement d'introduire une certaine forme d'authentification.

Chèvre mécontente
la source
3

Donc, vous voulez essentiellement limiter ajax.php à ne répondre qu'aux requêtes AJAX?

Je ne suis pas un expert en php, mais il semble possible de déterminer si une demande donnée provient d'AJAX ou d'une demande de navigateur "régulière" en vérifiant la valeur de $_SERVER['HTTP_X_REQUESTED_WITH'].

La source

ils appellent
la source
2
bon point, en supposant que l'agresseur n'utilise pas ajax ou ne forge pas cet en-tête HTTP
Adam
1

Comme quelqu'un l'a souligné ... les appels ajax ne sont que des récepteurs de $ _GET ou $ _POST, donc mon approche a toujours été de les traiter comme je le ferais pour n'importe quelle page d'action et de filtrer / désinfecter l'entrée. Si vous avez une petite variation de ce que vous attendez comme un mois par exemple, et que vous savez qu'il est toujours au format "Jan, Feb, Mar ...", vous pouvez définir un tableau des valeurs attendues et filtrer par rapport à celui-ci. Piéger tout ce qui ne correspond pas et éventuellement renvoyer quelque chose comme "Bzzt ... merci d'avoir joué ..."

Je ne peux pas penser à un exemple où mon script Ajax devrait être plus sûr qu'une soumission de formulaire.

HTH

digit1001
la source
+1 pour "Bzzt" - qui devient d'autant plus drôle dans le contexte de "Bzzt - merci d'avoir joué!" suivi d'un lent fondu au noir accompagné d'une interdiction de trois heures imposée par un cookie installé sur la machine de l'utilisateur (je suis sûr qu'il obtiendrait le message)
danlefree
0

Je pense qu'une partie importante de votre solution consistera à limiter le trafic à partir d'une empreinte digitale d'utilisateur spécifique. Peut-être un hachage de l'adresse IP, de la chaîne de l'agent utilisateur et des données envoyées.

En outre, la liaison de la page qui appelle ajax aux données renvoyées ajax peut être utile. Donc, sur la page en question, au chargement de la page, envoyez une clé de session qui est bonne pour les Xsessions, pour chaque demande ajax, votre JavaScript devra renvoyer cette clé ou l'ajax retournera un échec. Une fois que votre page atteint les X+1appels ajax, forcez l'utilisateur à faire une action (peut-être captcha? Peut-être même quelque chose comme un événement mousemoveou tapselon l'UA) avant d'envoyer une nouvelle clé de session sur le fil (hors bande de l'ajax d'origine) puis redémarrez le processus.

Bien que j'y pense, il est possible qu'une partie de votre problème soit la validation laxiste des paramètres envoyés. Si les gens peuvent simplement jouer avec les paramètres envoyés et récupérer des données valides, rendez cela plus difficile. La façon de procéder dépend du type de valeurs envoyées par le client et du type de méfait qu'un mauvais acteur peut commettre en envoyant de mauvaises valeurs.

artlung
la source