47 votes

Détecter Ajax en PHP et s'assurer que la demande provenait de mon propre site web

J'utilise mon PHP backend pour détecter Ajax comme ceci: $_SERVER['HTTP_X_REQUESTED_WITH']. Cela me donne une détection fiable, s'assurer que la demande est Ajaxed.

Comment puis-je m'assurer que la demande est venue de mon propre nom de domaine, et non pas un domaine externe ou un robot?

www.example.com/ajax?true pourrait permettre à quiconque de faire un appel Ajax et coupez les informations.

J'ai pu faire des séances pour tout le monde qui entre dans mon site normalement, puis autoriser les appels Ajax.. mais qui peut être faux aussi.

Est-il même pas question, dans ces jours?

33voto

Gordon Points 156415

Permettez-vous de Contrôleur

  • générer un jeton d'accès
  • stocker dans la session pour comparaison ultérieure

À votre avis

  • déclarer le jeton d'accès comme variable JS
  • envoyer le jeton à chaque demande

De retour dans votre Contrôleur

  • valider HTTP_X_REQUESTED_WITH
  • valider jeton

Vérifiez ces lignes directrices de OpenAjax.
Aussi, lire l'article sur codinghorror.com Annie liés.

23voto

Annie Points 5388

Vous pouvez vérifier le HTTP_REFERRER, mais tous les navigateurs ne le définissent pas. Le meilleur moyen est d'écrire un wrapper pour vos appels ajax du côté JavaScript, qui renvoie une partie de document.cookie au serveur - seul votre domaine a accès au cookie. Vous pouvez comparer le cookie dans les en-têtes de requête avec le cookie dans l'appel AJAX en php.

En réponse à, "est-ce même important, ces jours-ci" - OUI, si! Lisez ceci .

6voto

Jim Points 167

Concernant votre dernière question: "est-il encore question, dans ces jours-ci?" C'est un cas par cas en question. Si la requête ajax est en train de faire quelque chose qui ne nécessite pas de sécurité (par exemple, le chargement des derniers cours de la bourse) alors il n'a vraiment pas d'importance à mon humble avis. Si la demande est en cours de chargement de l'information qui doit être sécurisé (par exemple, le retour d'informations d'identification ou de faire quelque chose sur le serveur), alors vous devez le traiter comme tel.

Personnellement, je ne pas utiliser les variables de serveur pour savoir quand quelque chose est une requête ajax. Au lieu de cela j'ai juste ajouter un paramètre de requête à l'appel ajax (par ex. http://domain.com/?ajax=true). Si j'ai besoin de sécuriser l'appel ajax alors je voudrais utiliser les mêmes méthodes que l'obtention d'un régulier de la demande de page (en utilisant à la fois le client et le serveur). Comme Lucas Oman a souligné, quoi que ce soit sur le côté client peut être falsifiée. Bas de ligne ne faites pas confiance à toute demande, même si vous pensez que cela vient de votre site ou de la base de données. Toujours suivre le mantra "filtre d'entrée - sortie d'échappement".

3voto

Ben Shelock Points 4405

David Walsh a une bonne solution

 /* decide what the content should be up here .... */
$content = get_content(); //generic function;

/* AJAX check  */
if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
    /* special ajax here */
    die($content);
}

/* not ajax, do more.... */
 

2voto

Lucas Oman Points 9027

Vraiment, le plus sûr moyen pour ce faire est, comme vous l'avez suggéré, utilisation côté serveur sessions, comme ils ne peuvent pas être conçues comme des cookies.

Accordé, quelqu'un peut toujours détourner un ID de session, mais si vous aussi stocker l'adresse IP de l'utilisateur dans leur session et vérifier à chaque requête, vous pouvez éliminer beaucoup de tentatives de détournement. Seule une personne sur le même réseau local ou par procuration qui pourrait la détourner.

Toute autre méthode mentionnés-les cookies, javascript, http referer-dépend de données côté client, ce qui est dangereux et doit toujours être soupçonné de faux, faux, détourné et malicieusement construit.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X