web-dev-qa-db-fra.com

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

J'ai un site qui utilise des appels ajax pour effectuer un certain nombre de fonctions. Le navigateur Web appelle un script - ajax.php. Bien que j'utilise les données de publication pour transmettre les données et limiter les commandes que le script ajax peut appeler, rien n'empêche en réalité les utilisateurs de spoofer des appels ajax pour tenter de manipuler le site. Existe-t-il un moyen générique d'empêcher les utilisateurs de spoofer 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 limites dans le script php et empêcher les utilisateurs d'usurper des choses qu'ils ne seraient pas autorisés à faire, mais de leur permettre d'usurper l'endroit où ils seraient autorisés.

12
Daniel Bingham

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

Si vous souhaitez simplement un simple groupe de personnes n'appelant pas à partir de votre page, vous pouvez vérifier le référant, utiliser un cookie ou ajouter un champ masqué aléatoire envoyé par la page d'appel et expirant au bout d'un certain temps. Mais ceux-ci sont faciles à usurper si l'utilisateur est vraiment déterminé.

12
delete

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 ne diffère en aucun cas du chargement direct de l'URL, sauf que, dans ce dernier cas, les données renvoyées sont affichées dans le navigateur comme une page Web.

C’est précisément 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 tourner, mais si les utilisateurs sont en mesure de "manipuler le site" en appelant votre script avec des données erronées, alors vous le faites mal.

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

6
DisgruntledGoat

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

Je ne suis pas un expert en php, mais il semble possible de déterminer si une requête donnée provient de AJAX ou d'une requête "habituelle" de votre navigateur en vérifiant la valeur de $_SERVER['HTTP_X_REQUESTED_WITH'].

Source

3
theycallmemorty

Comme quelqu'un l'a fait remarquer ... les appels ajax sont juste des destinataires de $ _GET ou $ _POST, mon approche a donc toujours été de les traiter comme je le ferais pour n'importe quelle page d'action et pour filtrer/assainir l'entrée. Si vous avez une petite variation de ce que vous attendez comme un mois, par exemple, et que vous savez que c'est toujours au format "Jan, Février, Mars ...", vous pouvez définir un tableau des valeurs attendues et le filtrer. Piège tout ce qui ne correspond pas et renvoie éventuellement quelque chose comme "Bzzt ... merci d'avoir joué ..."

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

HTH

1
digit1001

Je pense qu'une partie importante de votre solution sera le trafic limitation du débit provenant d'une empreinte digitale d'utilisateur spécifique. Peut-être un hachage d'adresse IP, une chaîne d'agent d'utilisateur et les données envoyées.

En outre, la liaison de la page qui appelle ajax aux données renvoyées par ajax peut être utile. Ainsi, sur la page en question, lors du chargement de la page, envoyez une clé de session appropriée pour les sessions X. Pour chaque demande ajax, votre JavaScript devra renvoyer cette clé ou l’ajusteur renverra un échec. Une fois que votre page a affiché X+1 appels ajax, forcez l'utilisateur à effectuer une action (captcha? Peut-être même quelque chose comme un événement mousemove ou tap selon l'UA) avant d'envoyer une nouvelle session. appuyez sur le fil vers le bas (hors bande par rapport à l'ajax d'origine) puis relancez le processus.

Bien que j'y réfléchisse, il est possible qu'une partie de votre problème soit une validation laxiste des paramètres envoyés. Si les utilisateurs peuvent simplement jouer avec les paramètres envoyés et récupérer des données valides, il est alors plus difficile de le faire. Cela 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.

0
artlung