web-dev-qa-db-fra.com

Est-il prudent de corriger les erreurs CORS Origin (Access-Control-Allow-Origin) avec une directive d'en-tête php?

J'essaie de montrer un Formidable Pro Form d'un site WordPress à l'autre. J'ai suivi l'API du développeur et l'API REST, mais j'ai été confronté à un problème CORS.

Ensuite, j'ai trouvé une suggestion sur un fil de forum suggérant d'ajouter à cette ligne de code le functions.php du site où le formulaire original est:

header("Access-Control-Allow-Origin: *");

J'ai essayé ce code et cela a fonctionné parfaitement bien.

Ma question est la suivante: ce code ouvre-t-il des risques de sécurité ou d'autres vulnérabilités?

La solution semble trop simple pour un problème auquel de nombreuses personnes sont confrontées.

Votre contribution est très appréciée.

4
Atef Wagih

Oui, vous ouvrez votre site à la demande de n'importe quel script du réseau entier via AJAX.

Il serait préférable de limiter l’Origine à one domaine distant spécifique à partir duquel vous utilisez l’API, comme cet exemple :

header("Access-Control-Allow-Origin: http://mozilla.com");

Toutefois, comme l'indique la documentation de mozilla, un client peut créer une origine avec l'Origine. Néanmoins, limiter les sites auxquels un utilisateur occasionnel peut se connecter est un moyen de dissuasion pour certaines attaques.

Mieux encore, vous pouvez limiter votre demande à uniquement aux méthodes dont vous avez réellement besoin pour autoriser , Gist est cet extrait, qui fonctionne pour plusieurs domaines, si la variable $_SERVER['HTTP_Origin'] est remplie :

add_action('rest_api_init', function() {

     /* unhook default function */
     remove_filter('rest_pre_serve_request', 'rest_send_cors_headers');

     /* then add your own filter */
     add_filter('rest_pre_serve_request', function( $value ) {
          $Origin = get_http_Origin();
          $my_sites = array( 'http://site1.org/', 'http://site2.net', );
          if ( in_array( $Origin, $my_sites ) ) {
              header( 'Access-Control-Allow-Origin: ' . esc_url_raw( $Origin ) );
          } else {
              header( 'Access-Control-Allow-Origin: ' . esc_url_raw( site_url() ) );
          }
          header( 'Access-Control-Allow-Methods: GET' );

          return $value;
     });
}, 15);

Comme vous pouvez le constater, cet extrait utilise la fonction get_http_Origin fournie par WordPress, mais renvoie null ou vide si la clé HTTP_Origin n'est pas renseignée dans le tableau $_SERVER et n'est donc pas disponible pour le PHP. script, peut-être parce qu’il est bloqué par le proxy cloudflare que vous utilisez. Je vérifierais rapidement, avec un script avec la <?php phpinfo(); ?>, si vous avez cette variable remplie.

Peut-être que le site Origin est rempli dans un autre en-tête par cloudflare et que vous pouvez l'utiliser dans une fonction liée au filtre http_Origin. Si vous êtes perdu à ce stade, éditez votre question d'origine en affichant le contenu de la variable _SERVER, à l'exception de vos chemins d'accès et de votre mot de passe du système de fichiers.

Je serais heureux d'aider.

4
Jesús Franco

background - les navigateurs limitent l'accès distant à partir de scripts au seul site à partir duquel il a été chargé. Si ce type de vérification n’avait pas été effectué, il aurait été possible, lors de la visite d’un site X, de soumettre des données à votre compte Gmail (si vous êtes connecté) sans même avoir besoin de deviner votre utilisateur et votre mot de passe, car le navigateur ont envoyé les cookies d’authentification appropriés à gmail.

Le "protocole" CORS est là pour vous aider à assouplir cette restriction en cas de besoin.

Donc, la question que vous devriez vous poser, est-ce que j'en ai besoin? D'une part, je ne vois pas pourquoi 99% des sites wordpress en auraient besoin, d'autre part, les cookies wordpress ont une durée de vie relativement courte et 99% des sites wordpress ne vont pas être la cible d'une telle attaque aléatoire.

Je dirais que puisque l’API restante est une API en mutation et qu’elle a accès à des informations privées, vous ne devez pas utiliser resti api dans votre solution si vous devez activer cors, vous feriez mieux d’écrire votre propre API en lecture seule.

1
Mark Kaplun