web-dev-qa-db-fra.com

autoriser les requêtes ajax entre domaines

Dans mon projet, je dois autoriser les autres à envoyer des requêtes ajax à mon script. Ainsi, les demandes externes peuvent provenir d’autres sites Web et domaines et peut-être d’extensions de navigateur.
J'ai simplement ajouté ces deux lignes en haut de mon script pour les laisser faire: 

header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST');  

Maintenant, ma question est la suivante: y a-t-il une considération de sécurité que j'ai manquée? cette solution simple pose-t-elle de sérieux problèmes?
Si oui, quelle est la meilleure solution? 

Merci pour la réponse.

39
Aliweb

Comme mentionné ci-dessus, tout le monde peut envoyer une demande à votre page à tout moment: les principales préoccupations en matière de sécurité sont donc de valider la saisie de l'utilisateur et de ne révéler que les informations disponibles pour la consommation publique. Mais cela s'applique à tous les scripts.

Les deux principaux problèmes sur lesquels vous devez vous concentrer (après la validation de la saisie de l'utilisateur) sont:

  1. Le problème que vous pouvez avoir est que les utilisateurs reçoivent les informations dans leurs scripts. Selon le navigateur (et même entre les variantes du même navigateur), différentes règles de sécurité les empêchent de récupérer les informations. Une solution courante consiste à renvoyer des informations sous la forme "JSONP", qui consiste à envelopper votre valeur de retour sous la forme d'un appel de fonction pouvant être exécuté par le client. Voici un exemple rapide (tiré de http://www.geekality.net/2010/06/27/php-how-to-easily-provide-json-and-jsonp/ ). Pour le verrouiller davantage, vous pouvez exiger que toutes les requêtes soient au format JSONP et rejeter toute personne n’envoyant pas la fonction de rappel.

.

<?php

header('content-type: application/json; charset=utf-8');
$data = array(1, 2, 3, 4, 5, 6, 7, 8, 9);
echo $_GET['callback'] . '('.json_encode($data).')';

?>
  1. Quelqu'un abuse de votre service en appelant trop régulièrement. Les solutions à cela sont d'intercepter l'adresse IP et de la rejeter si vous recevez trop d'appels d'une adresse IP. Pas infaillible, mais c'est un début. 

Autres facteurs à garder à l'esprit:

  • les cookies et autres en-têtes définis par votre script seront probablement ignorés
  • il en va de même pour les sessions
19
Robbie

Comme dit zerkms, s’ils viennent juste "d’aller" sur votre page php, ils pourront voir tout ce qui se passe. Si c'est possible (Je ne suis pas sûr que ce soit le cas), cela permettra également aux personnes indésirables de créer leurs propres formulaires, même sur un hôte local, et de les envoyer via AJAX pour obtenir les réponses qu'ils souhaitent. vous, et les informations sont ambiguës/inoffensives ... Alors je suppose que ce serait "sûr". Ce n'est pas une méthode correcte pour obtenir/transférer des informations sensibles 

1
Zak
private function set_headers() {
    header("HTTP/1.1 ".$this->_code." ".$this->get_status_message());
    header("Content-Type:".$this->_content_type);           
    header("Access-Control-Allow-Origin: *");
}
0
paras