wake-up-neo.com

Ist es sicher, Access-Control-Allow-Origin (CORS Origin) -Fehler mit einer PHP-Header-Direktive zu beheben?

Ich versuche, ein Formidable Pro Form von einer WordPress-Site zur anderen zu zeigen. Ich habe die API des Entwicklers und die API REST befolgt, hatte jedoch ein CORS-Problem.

Dann fand ich einen Vorschlag in einem Forenthread, der vorschlug, diese Codezeile dem functions.php der Site hinzuzufügen, auf der sich das ursprüngliche Formular befindet:

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

Ich habe diesen Code ausprobiert und es hat einwandfrei funktioniert.

Meine Frage ist: Öffnet dieser Code Sicherheitsrisiken oder andere Sicherheitslücken?

Die Lösung erscheint für ein Problem, mit dem viele Menschen konfrontiert sind, zu einfach.

Ihre Eingabe wird sehr geschätzt.

4
Atef Wagih

Ja, Sie öffnen Ihre Site, um über AJAX von einem anderen Skript im gesamten Web angefordert zu werden.

Es wäre besser, wenn Sie den Ursprung auf one bestimmte Remotedomäne beschränken, von der Sie die API verwenden, wie z. B. dieses Beispiel :

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

Wie aus der Mozilla-Dokumentation hervorgeht, kann ein Client das Origin-Verzeichnis fälschen. Die Beschränkung der Sites, die ein gelegentlicher Benutzer verbinden kann, ist jedoch eine Abschreckung für einige Angriffe.

Noch besser, Sie können Ihre Anfrage auf nur die Methoden, die Sie wirklich zulassen müssen beschränken. Das Gist ist dieses Snippet und funktioniert für mehrere Domains. wenn Sie die Variable $_SERVER['HTTP_Origin'] gefüllt haben :

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);

Wie Sie sehen, verwendet dieses Snippet die von WordPress bereitgestellte Funktion get_http_Origin , gibt jedoch null oder leer zurück, wenn der Schlüssel HTTP_Origin nicht im Array $_SERVER eingetragen ist, und steht daher dem PHP script, möglicherweise weil es von dem von Ihnen verwendeten Cloudflare-Proxy blockiert wird. Ich würde schnell mit einem Skript mit der <?php phpinfo(); ?> überprüfen, ob Sie diese Variable gefüllt haben.

Möglicherweise wird die Origin-Site in einem anderen Header von Cloudflare gefüllt, und Sie können sie in einer Funktion verwenden, die mit dem http_Origin-Filter verknüpft ist. Wenn Sie bis zu diesem Punkt verloren sind, bearbeiten Sie Ihre ursprüngliche Frage, indem Sie den Inhalt der Variablen _SERVER mit Ausnahme Ihrer Dateisystempfade oder Kennwörter veröffentlichen.

Ich würde gerne helfen.

4
Jesús Franco

hintergrund - Browser beschränken den Remotezugriff von Skripten nur auf die Site, von der sie geladen wurden. Wenn diese Art der Überprüfung nicht durchgeführt wurde, wäre es beim Besuch einer Site X möglich gewesen, Daten an Ihr Google Mail-Konto zu übermitteln (sofern Sie angemeldet sind), ohne dass Sie Ihren Benutzer und Ihr Kennwort erraten müssten, da dies der Browser tun würde haben die richtigen Authentifizierungscookies an Google Mail gesendet.

Das CORS "Protokoll" soll Ihnen helfen, diese Einschränkung bei Bedarf zu lockern.

Die Frage, die Sie sich stellen sollten, ist: Brauche ich sie? Einerseits kann ich nicht verstehen, warum 99% der WordPress-Sites dies benötigen, andererseits sind WordPress-Cookies relativ kurzlebig und 99% der WordPress-Sites sind kein Ziel eines solchen zufälligen Angriffs.

Ich würde sagen, da die Rest-API mutiert und Zugriff auf private Informationen hat, sollten Sie in Ihrer Lösung keine Rest-API verwenden, wenn Sie cors aktivieren müssen. Schreiben Sie besser Ihre eigene "Nur-Lese" -API.

1
Mark Kaplun