Forum: PC-Programmierung No 'Access-Control-Allow-Origin' header is present on the requested resource


von Joel (Gast)


Lesenswert?

Hallo Zusammen
Ich mache gerade ein kleines Projekt bei dem ich unteranderem auch auf 
steam zugreifen muss. Um genauer zu sein muss ich bzw. möchte ich das 
Inventar ein beliebigen users auslesen können. Dumm nur das ich ständig 
den Fehler No 'Access-Control-Allow-Origin' header is present on the 
requested resource bekomme. ich hab auch schon auf stackoverflow gefragt 
aber da hat mir niemand richtig geholfen. Die einzige nützliche 
information war das ich non CORS-compliant tool suchen soll, was ich 
dann auch gemacht habe. Habe dann das hier gefunden 
http://www.test-cors.org/. das hat mir dann diesen Javascript auschnitt 
gegeben :
1
var createCORSRequest = function(method, url) {
2
var xhr = new XMLHttpRequest();
3
if ("withCredentials" in xhr) {
4
// Most browsers.
5
xhr.open(method, url, true);
6
} else if (typeof XDomainRequest != "undefined") {
7
// IE8 & IE9
8
xhr = new XDomainRequest();
9
xhr.open(method, url);
10
} else {
11
// CORS not supported.
12
xhr = null;
13
}
14
return xhr;
15
};
16
17
var url = 'http://api.steampowered.com/ISteamEconomy/GetAssetClassInfo/v0001/?key=XXXXXXXXXXXXX&appid=730&class_count=1&classid0=1131459905';
18
var method = 'GET';
19
var xhr = createCORSRequest(method, url);
20
21
xhr.onload = function() {
22
console.log("super");
23
};
24
25
xhr.onerror = function() {
26
console.log("failed");
27
};
28
29
xhr.send();

Hab das dann bei mir eingebaut und es gab immer noch den Fehler. Somit 
bin ich wieder bei null.
Wäre nett wenn ihr mir eine Antwort mit einem Beispiel geben könntet da 
ich noch sehr neu in der HTML und JS umgebung binn.

MFG
Joel

: Verschoben durch User
von CORS (Gast)


Lesenswert?


von bluppdidupp (Gast)


Lesenswert?

Damit ein Javascript, das in einer eigenen Webseite unter z.B. 
www.example.org eingebunden ist, auf api.steampowered.com zugreifen 
kann, müsste api.steampowered.com einen Header 
"Access-Control-Allow-Origin: http://www.example.org"; ausgeben.
Da es das nicht tut, hast du keine Chance da mit Javascript weiter zu 
kommen, da der Browser den Request an api.steampowered.com blockiert, 
weil dabei die Domaingrenze überschritten wird: 
https://de.wikipedia.org/wiki/Same-Origin-Policy
...und der Server auf den zugegriffen wird, die Aufrufer-Domain nicht 
per "Access-Control-Allow-Origin" whitegelisted hat.

Um das Problem zu lösen, wäre möglich:
1) Bei Zugriff auf den Server "api.steampowered.com" könnte man dort den 
fehlenden Header setzen lassen (dort wohl eher unwahrscheinlich, die API 
wird vermutlich auch nicht für Aufruf via JavaScript gedacht sein)
2) Den Aufruf über ein Script auf www.example.org tunneln.
D.h. statt api.steampowered.com/api/... ruft man z.B. ein lokales 
PHP-Script www.example.org/apiproxy.php auf, welches wiederrum intern 
ohne Javascript den echten Aufruf nach api.steampowered.com macht.
3) Den Aufruf direkt über ein serverseitiges Script (z.B. php) absetzen 
und gar kein clientseitiges JS verwenden
4) Im verwendeten Browser die Cross-Domain Sicherheitsfeatures 
abschalten.
Chrome z.B. konnte man mal mit "--disable-web-security" aufrufen, kp ob 
das immer noch geht.
Das wäre natürlich nur für Tools für eigene interne/private Zwecke eine 
Möglichkeit, die man aber lieber nicht nutzt oder maximal temporär.

von Joachim S. (oyo)


Lesenswert?

Wirklich helfen kann ich leider nicht, aber an dieser Stelle möchte ich 
einfach mal meine eigene Verwunderung ausdrücken: Dieses CORS ist eines 
der komischsten Konzepte, die mir bislang untergekommen sind.

Da soll irgendein Sicherheitsfeature sein, soweit ich das verstehe - 
aber ein böswilliger Angreifer könnte das ganze Sicherheitsfeature z.B. 
mit einem Proxy leicht ausser Kraft setzen.

Ansonsten hat bluppdidupp eigentlich alles wissenswerte dazu schön 
zusammengefasst.

von Joel (Gast)


Lesenswert?

Danke euch allen ihr habt mir wirklich weitergeholfen!!!!!


MFG
Joel

von bluppdidupp (Gast)


Lesenswert?

Bei einer URL wie 
http://api.steampowered.com/ISteamEconomy/GetAssetClassInfo/v0001/?key=XXXXXXXXXXXXX&appid=730&class_count=1&classid0=1131459905
wo scheinbar ein Key drin steht, würde ich sowieso sagen dass das besser 
serverseitig laufen sollte, damit ein Seitenbesucher den Key nie zu 
Gesicht bekommt und damit nicht potentiell selbst was anstellen könnte 
;D

Das eigentliche Sicherheitsfeature ist die Cross-Domain-Policy. CORS ist 
eigentlich wirklich eher ein Unsicherheits-Feature - Man hat damit die 
Möglichkeit Ausnahmen für die Cross-Domain-Policy zu definieren.
Steam hat in diesem Falle keine Ausnahmen zugelassen, indem es keinen 
Header mit Ausnahme-Aufrufer-Domains oder Wildcard ausgibt.

z.B. bei einer API, die sowieso nur öffentlich zugängliche Daten 
zurückliefert (PLZ-Abfrage oder sowas), kann es Sinn machen den Zugriff 
per AJAX frei zu erlauben, damit ein Webseitenbetreiber nicht erst 
selbst einen Proxy nutzen muss, der dann sowieso nur alles 1:1 
durchreicht und auch keine Authentifizierung nötig hat.

Ohne Cross-Domain-Policy bei AJAX wäre es aber z.B. möglich über eine 
böswillige Seite (oder legitime Seite mit Cross-Site-Scripting Lücke) 
auf Ressourcen zuzugreifen, die von extern eigentlich gar nicht 
erreichbar sind.
D.h. wenn man es schafft einen Besucher auf eine befallene/unsichere 
Seite zu locken, dann könnte diese Seite von einem Angreifer als Proxy 
genutzt werden um auf Resourcen im internen Netzwerk zuzugreifen.

Als Webseitenbetreiber wäre es noch besser immer CSP zu nutzen:
https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP
...was leider bei bestehenden Seiten teilweise enormen Umbau-Aufwand 
bedeuten kann, wenn man es richtig nutzen will.

von Joel (Gast)


Lesenswert?

Ich bedanke mich nochmal herzlichst für diese Antwort^^.

Da ich noch sozusagen im Webseitenbereich noch ein neuling bin müsstes 
du mir das mit den 'serverseitigen laufen' noch erklären müsstes 
natürlich nur wenn du dazu zeit hättest. Wenn du aber ein Link der mir 
das eklärt bereit hättest würde mir das schon reichen^^.

MFG
Joel

von Joel (Gast)


Lesenswert?

Joel schrieb:
> das mit den 'serverseitigen laufen' noch erklären müsstes
> natürlich nur wenn du dazu zeit hättest. Wenn du aber ein Link der mir
> das eklärt bereit hättest würde mir das schon reichen^^.
>
> MFG

Mit dieses schönen Text meinte ich das du mir das mit den 
'serverseitigen laufen' noch erklären müsstes aber natürlich nur wenn du 
dazu zeit hättest. Wenn du aber ein Link der mir das eklärt bereit 
hättest würde mir das schon reichen^^.

von S. R. (svenska)


Lesenswert?

Dein Browser ist ein Client. Alles, was darin stattfindet (also das 
Javascript) läuft innerhalb deines Clients statt und ist daher 
clientseitig.

Dein Browser redet mit einem Server. Was der tut, ist (aus Sicht des 
Browsers) serverseitig. Der Server selbst kann aber gleichzeitig auch 
ein Client für z.B. die Steam-API sein (für die dann Steam den Server 
bereitstellt).

Ein Proxy ist z.B. für deinen Browser ein Server, aber für die 
aufgerufene Webseite ein Client.

von Joel (Gast)


Lesenswert?

Achso Vielen Vielen Dank!!!!!!!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.