Firefox 'Cross-Origin Request Blocked' trotz Headern

118

Ich versuche, eine einfache Cross-Origin-Anfrage zu stellen, und Firefox blockiert sie konsequent mit diesem Fehler:

Ursprungsübergreifende Anforderung blockiert: Die gleiche Ursprungsrichtlinie verbietet das Lesen der Remote-Ressource unter [url]. Dies kann behoben werden, indem die Ressource in dieselbe Domäne verschoben oder CORS aktiviert wird. [url]

Es funktioniert gut in Chrome und Safari.

Soweit ich das beurteilen kann, habe ich auf meinem PHP alle richtigen Header gesetzt, damit dies funktioniert. Hier ist, womit mein Server antwortet

HTTP/1.1 200 OK
Date: Mon, 23 Jun 2014 17:15:20 GMT
Server: Apache/2.2.22 (Debian)
X-Powered-By: PHP/5.4.4-14+deb7u8
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Headers: Content-Type
Access-Control-Request-Headers: X-Requested-With, accept, content-type
Vary: Accept-Encoding
Content-Length: 186
Content-Type: text/html

Ich habe versucht, Angular, jQuery und ein grundlegendes XMLHTTPRequest-Objekt wie folgt zu verwenden:

var data = "id=1234"
var request = new XMLHttpRequest({mozSystem: true})
request.onload = onSuccess;
request.open('GET', 'https://myurl.com' + '?' + data, true)
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
request.send()

... und es funktioniert in jedem Browser außer Firefox. Kann mir jemand dabei helfen?

Godwhacker
quelle
Können Sie alle Anfragen und Antworten vollständig nachverfolgen? Oder zumindest eine Teststelle bereitstellen? Wenn die Website auf die Remote-Ursprungsdatei http, https, zugreift? mozSystemwird nicht für normale Websites unterstützt, sondern nur für gepackte Firefox-OS- Apps. Löschen Sie diese Option.
Nmaier
1
@nmaier Header beim Senden als POST statt GET: Accept application/json, text/plain, */* Accept-Encoding gzip, deflate Accept-Language en-US,en;q=0.5 Content-Length 35 Content-Type application/x-www-form-urlencoded; charset=UTF-8 Host [url] Origin [url] Referer [referrer url] User-Agent Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:30.0) Gecko/20100101 Firefox/30.0 Fehler: Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at [url]. This can be fixed by moving the resource to the same domain or enabling CORS. [url]
Godwhacker
2
@nmaier Tatsächlich scheint dies ein Problem mit dem Sicherheitszertifikat auf der Site zu sein, auf die ich zugreife. Firefox gibt nur einen falschen Fehler aus. Wenn ich die Site zur Liste der Ausnahmen hinzufüge, funktioniert es einwandfrei.
Godwhacker

Antworten:

121

Es stellte sich heraus, dass dies nichts mit CORS zu tun hat - es war ein Problem mit dem Sicherheitszertifikat. Irreführende Fehler = 4 Stunden Kopfschmerzen.

Godwhacker
quelle
3
Hatte gerade genau dieses Problem, der Fehler ist zu allgemein und außerdem verwenden Chrome und Firefox unterschiedliche Zertifikatspeicher, sodass das Debuggen schwieriger ist. Ich hätte vermuten müssen, dass mein Proxy, wenn er keine OPTIONS-Anforderungen erfasst hat (beim SSL-Handshake unterbrochen wurde).
Daniel Correia
4
Godwhacker, ich bin vielleicht in das gleiche Problem verwickelt. Wie haben Sie herausgefunden, dass es sich um das Sicherheitszertifikat handelt? Wo kannst du das sehen?
Leo
9
In meinem Fall hatte ich eine eckige App, die Anrufe an einen anderen Server tätigte, wobei beide intern signierte Zertifikate verwendeten. Firefox vertraut dem Zertifikat jedoch nicht automatisch, da es von einer Behörde nicht anerkannt wird. Daher musste ich sicherstellen, dass die Zertifikate für beide Server als Ausnahmen in Firefox hinzugefügt wurden, bevor dieses Problem behoben wurde.
Sam Storie
3
Für mich bestand die Lösung darin, withCredentials=truedie XHR-Instanz festzulegen. Andernfalls konnte Firefox das Client-Zertifikat bei der Anforderung nicht verwenden (funktionierte jedoch in Chrome einwandfrei).
Clint Harris
1
Kommentar von @SamStorie klingt eher nach Antwort als nach dieser Antwort. Vielen Dank
Naga
26

Ich stellte fest, dass mein Problem darin bestand, dass der Server, an den ich die Cross-Anfrage gesendet habe, ein nicht vertrauenswürdiges Zertifikat hatte.

Wenn Sie eine Verbindung zu einer domänenübergreifenden Verbindung herstellen möchten https, müssen Sie zuerst eine Ausnahme für dieses Zertifikat hinzufügen.

Sie können dies tun, indem Sie den blockierten Link einmal besuchen und die Ausnahme hinzufügen.

Cracker0dks
quelle
5
Das hilft niemandem, der Ihre Website besucht, besonders, wenn Sie glücklich sind, eine Nachricht mit der Aufschrift "Wenn Sie Firefox verwenden, gehen Sie bitte auf diese Website und fügen Sie sie Ihrer Liste der Ausnahmen hinzu"
Godwhacker,
@ Cracker0dks "Besuchen Sie den blockierten Link einmal und fügen Sie die Ausnahme hinzu" Können Sie erläutern, wo die Ausnahme hinzugefügt werden soll? Ich benutze Firefox Quantum. TIA
Paul
1
Sie surfen zu dem Link, über den sich Firefox direkt beschwert. Dann erhalten Sie die Zertifikatswarnung. Zulassen Sie das Zertifikat. Besuchen Sie Ihre primäre Site erneut.
Cracker0dks
25

Ich bin auf diese Frage gestoßen, nachdem festgestellt wurde, dass Anfragen in Firefox mit der folgenden Nachricht blockiert wurden:

Grund: Die CORS-Anfrage war nicht erfolgreich

Nachdem ich mir die Haare ausgezogen hatte, stellte ich fest, dass eine neu installierte Firefox-Erweiterung, Privacy Badger, die Anfragen blockierte.

Wenn Sie nach einem Kopfkratzer zu dieser Frage kommen, überprüfen Sie, welche Erweiterungen Sie installiert haben, um festzustellen, ob eine von ihnen Anforderungen blockiert.

Weitere Informationen finden Sie unter Grund: Die CORS-Anforderung war auf MDN nicht erfolgreich .

Professor für Programmierung
quelle
Wie haben Sie herausgefunden, welche Erweiterung die Anforderungen blockiert? Ich habe das gleiche Problem, da die Anfrage in einem Firefox mit einem neuen Profil (also keine Erweiterungen) erfolgreich ist
Ciprian Tomoiagă
1
Ich habe auf jede Erweiterung geklickt, um festzustellen, ob Inhalte für die bestimmte Website, mit der ich ein Problem hatte, blockiert wurden. Ghostery hatte einen Eintrag, also habe ich die Site als vertrauenswürdig markiert, die Seite neu geladen und die Anfragen waren erfolgreich.
Professor für Programmierung
1
Danke dir! Ich habe auch die Erweiterung Project Insight entdeckt, die einen Überblick über die Berechtigungen aller Erweiterungen gibt. addons.mozilla.org/en-US/firefox/addon/project-insight
Ciprian Tomoiagă
1
@awendt Oof. Privacy Badger auch für mich. Vielen Dank.
Jason Leach
11

Wenn Sie kein "echtes" Zertifikat haben (und daher ein selbstsigniertes Zertifikat verwenden), können Sie in FireFox Folgendes aufrufen:

Options > Privacy & Security > (scroll to the bottom) View Certificates > Add Exception.

Geben Sie dort den Speicherort ein, z. B.: Https: //wwww.myserver: myport

Hypenate
quelle
Dies funktionierte für mich, wenn mein CORS in allen anderen Browsern außer Firefox mit dem Fehler -> Ursprungsübergreifende Anforderung blockiert: Die gleiche Ursprungsrichtlinie verbietet das Lesen der Remote-Ressource unter localhost: 44304 / v1 / search . (Grund: CORS-Anfrage war nicht erfolgreich).
JGilmartin
5

Nur ein Wort der Warnungen. Ich habe das Problem mit Firefox und CORS endlich umgangen.

Die Lösung für mich war dieser Beitrag

Festlegen von CORS (Cross-Origin Resource Sharing) in Apache mit korrekten Antwortheadern, die alles durch | ermöglichen Benjamin Horn

Firefox verhielt sich jedoch sehr, sehr seltsam, nachdem diese Header auf dem Apache-Server (im Ordner .htaccess) festgelegt wurden.

Ich fügte eine Menge console.log("Hi FF, you are here A")usw. hinzu, um zu sehen, was los war.

Zuerst sah es so aus, als würde es hängen bleiben xhr.send(). Aber dann stellte ich fest, dass es nicht zu dieser Aussage kam. Ich stellte einen anderen console.logdirekt davor und kam nicht dorthin - obwohl zwischen dem letzten console.logund dem neuen nichts war . Es hörte einfach zwischen zwei auf console.log.

Zeilen neu anordnen, löschen, um festzustellen, ob die Datei ein seltsames Zeichen enthält. Ich habe nichts gefunden

Durch einen Neustart von Firefox wurde das Problem behoben.

Ja, ich sollte einen Fehler melden. Es ist nur so seltsam, dass ich nicht weiß, wie ich es reproduzieren soll.

HINWEIS : Und oh, ich habe nur die Header always setTeile gemacht, nicht den Rewrite*Teil!

Löwe
quelle
Im Wesentlichen die gleiche Geschichte für mich heute. Durch einen Neustart von Firefox wurde das Problem behoben. Mehr als 5 Jahre später.
Søren Mortensen
3

Einfach hinzufügen

<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
</IfModule>

zu der .htaccessDatei im Stammverzeichnis der Website, mit der Sie eine Verbindung herstellen möchten.

Gareth
quelle
Das ist in Ordnung, wenn Sie festlegen möchten, dass Anforderungen von überall akzeptiert werden. Nicht in Ordnung, wenn Sie dies nicht tun. Dies ist der gesamte Punkt des Headers.
Godwhacker
2

Überprüfen Sie für die Nachwelt auch die Serverprotokolle, um festzustellen, ob die angeforderte Ressource 200 zurückgibt.

Ich stieß auf ein ähnliches Problem, bei dem alle richtigen Header in der Ajax-Anfrage vor dem Flug zurückgegeben wurden, aber der Browser meldete, dass die eigentliche Anfrage aufgrund fehlerhafter CORS-Header blockiert war.

Es stellte sich heraus, dass die angeforderte Seite aufgrund eines fehlerhaften Codes einen 500-Fehler zurückgab, jedoch nur, wenn sie über CORS abgerufen wurde. Der Browser (sowohl Chrome als auch Firefox) hat fälschlicherweise gemeldet, dass der Header "Access-Control-Allow-Origin" fehlte, anstatt zu sagen, dass die Seite 500 zurückgegeben hat.

Jack Stouffer
quelle
1

Versuchen Sie dies, es sollte Ihr Problem lösen

  1. Fügen Sie in Ihrer config.php www pre in Ihre domain.com ein. Beispielsweise:

    HTTP define('HTTP_SERVER', 'http://domain name with www/');
    HTTPS define('HTTPS_SERVER', 'http://domain name with www/');
  2. Fügen Sie dies Ihrer .htaccess-Datei hinzu

    RewriteCond %{REQUEST_METHOD} OPTIONS RewriteRule ^(.*)$ $1 [R=200,L]
Dharmendra Manikpuri
quelle
1

Es stellte sich für mich heraus, dass ich den Access-Control-Allow-OriginAntwortheader auf einen bestimmten (und den richtigen) host.comWert gesetzt habe, dieser aber http://host.comstattdessen zurückgegeben werden musste. Was macht Firefox? Die GET-Anforderung wird stillschweigend verschluckt und der XHR wird der Status 0 zurückgegeben, ohne dass Warnungen an die Javascript-Konsole ausgegeben werden, während bei anderen ähnlichen Fehlern zumindest etwas gesagt wird. Ai ai.

Rogerdpack
quelle
1
Scheint, als würde das Schema erwartet, wenn man sich die Beispiele unter w3.org/TR/cors ansieht, aber trotzdem danke, ich habe auch das Falsche getan, und ja, die Firefox-Fehlermeldung fehlt.
Richard Green
1

Überprüfen Sie zum Debuggen nach Möglichkeit die Serverprotokolle. Firefox gibt aus einer Reihe von Gründen CORS-Fehler in der Konsole zurück.

Einer der Gründe ist auch das Plugin uMatrix (und ich denke auch NoScript und ähnliches).

Johndodo
quelle
0

Ich hatte ein ähnliches Problem und denke, dass es gültig ist, registriert zu werden, wie ich es behoben habe:

Ich habe ein System, das im Wesentlichen über Symfony 3 aufgebaut ist. Aus Gründen des Selbstlernens und der Leistung habe ich beschlossen, einige Skripte mit GoLang zu schreiben, auch mit einer API mit öffentlichem Zugriff.

Meine Go-API erwartet Parameter im Json-Format und gibt auch die Antwort im Json-Format zurück

Um diese GoApis zu nennen, verwende ich meistens $ .ajax (jQuery). Der erste Test war eine Täuschung: das (un) berühmte Popup "Cross-Origin Request Blocked"! Dann habe ich versucht, die "Access-Control-Allow-Origin: *" auf Apache Conf, Htaccess, PHP, Javascript und überall dort zu setzen, was ich auf Google finden konnte!

Aber auch der gleiche frustrierende Fehler !!!

Die Lösung war einfach: Ich musste "POST" -Anfragen anstelle von "GET" stellen.

Um dies zu erreichen, musste ich sowohl GoLang als auch JavaScript anpassen, um GET! Sobald dies erledigt ist, wird keine Cross-Origin-Anfrage mehr für mich blockiert !!!

Ich hoffe es hilft

PS:

Ich verwende Apache und Vhost im Verzeichnisblock, den ich habe

  Header always set Access-Control-Allow-Origin "*"
  Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT"

Denken Sie daran: "*" bedeutet, dass Sie Anfragen von jedermann annehmen !!! (Was möglicherweise ein Sicherheitsmangel ist) In meinem Fall ist es in Ordnung, da es sich um eine öffentliche API handelt

PS2: Meine Header

Antwortheader

Access-Control-Allow-Credentials    true
Access-Control-Allow-Headers    Authorization
Access-Control-Allow-Methods    GET, POST, PUT
Access-Control-Allow-Origin http://localhost
Content-Length  164
Content-Type    application/json; charset=UTF-8
Date    Tue, 07 May 2019 20:33:52 GMT

Anforderungsheader (469 B)

Accept  application/json, text/javascript, */*; q=0.01
Accept-Encoding gzip, deflate
Accept-Language en-US,en;q=0.5
Connection  keep-alive
Content-Length  81
Content-Type    application/x-www-form-urlencoded; charset=UTF-8
Host    localhost:9003
Origin  http://localhost
Referer http://localhost/fibootkt/MY_app_dev.php/MyTest/GoAPI
User-Agent  Mozilla/5.0 (Macintosh; Intel …) Gecko/20100101 Firefox/66.0
Diego Favero
quelle
0

Wenn die oben genannten Antworten nicht helfen, prüfen Sie, ob der Back-End-Server betriebsbereit ist oder nicht, da in meinem Fall der Server abgestürzt ist und sich dieser Fehler als völlig irreführend herausstellt.

Neeraj Sewani
quelle
0

In meinem Fall war es mein ADBLOCKER ! Aus irgendeinem Grund wurde es auf meinem lokalen Host aktiviert und verursachte diesen Fehler in Firefox.

Das Deaktivieren oder Deinstallieren des Plugins sollte dies beheben.

In Ihrem Fall handelt es sich möglicherweise nicht um einen Adblocker, sondern um ein anderes Firefox-Plugin. Testen Sie es zunächst inkognito ohne Plugins, um festzustellen, ob dies das Problem ist, und deaktivieren Sie die Plugins dann systematisch, bis Sie den Schuldigen gefunden haben.

Christian Heath
quelle
-3

Die Dateien sind selbsterklärend. Machen Sie eine Datei, nennen Sie es etwas. In meinem Fall jq2.php.

<html>
<head>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script>
    // document is made ready so that the program starts when we load this page       
    $(document).ready(function(){

        // it tells that any key activity in the "subcat_search" filed will execute the query.
        $("#subcat_search").keyup(function(){

            // we assemble the get link for the direction to our engine "gs.php". 
            var link1 = "http://127.0.0.1/jqm/gs.php?needle=" + $("#subcat_search").val();

            $.ajax({
                url: link1,
                // ajax function is called sending the input string to "gs.php".
                success: function(result){
                    // result is stuffed in the label.
                    $("#search_val").html(result);
                }
            });
        })   

    });
</script>
</head>

<body>

<!-- the input field for search string -->
<input type="text" id="subcat_search">
<br>
<!-- the output field for stuffing the output. -->
<label id="search_val"></label>

</body>
</html>

Jetzt werden wir eine Engine einbinden, eine Datei erstellen und sie so nennen, wie Sie möchten. In meinem Fall ist es gs.php.

$head = "https://maps.googleapis.com/maps/api/place/textsearch/json?query="; //our head
$key = "your key here"; //your key
$hay = $_GET['needle'];

$hay = str_replace(" ", "+", $hay); //replacing the " " with "+" to design it as per the google's requirement 
$kill = $head . $hay . "&key=" . $key; //assembling the string in proper way . 
print file_get_contents($kill);

Ich habe versucht, das Beispiel so einfach wie möglich zu halten. Und da der Link bei jedem Tastendruck ausgeführt wird, wird das Kontingent Ihrer API ziemlich schnell verbraucht.

Natürlich gibt es kein Ende für Dinge, die wir tun können, wie das Einfügen der Daten in eine Tabelle, das Senden an die Datenbank und so weiter.

Harte Mehta
quelle
Bitte posten Sie die gleiche Antwort nicht mehr als einmal. Und bitte stellen Sie sicher, dass Ihre Antwort die Frage tatsächlich beantwortet. Wenn Sie jemanden an eine andere Stelle leiten müssen, um weitere Informationen zu erhalten, ist dies keine gute Antwort.
Elixenid
Hallo, ich habe den Link verwendet, da er weitere Informationen wie Voraussetzungen usw. Enthält. Wenn Sie es für angemessen halten, werde ich es entfernen.
Harsh Mehta