2014-12-10 9 views
7

Ich habe eine Frage bezüglich eines möglichen Sicherheitsproblems/einer Einschränkung bezüglich JavaScript gehostet auf einer Domäne (ex: Domäne eines CDN, sagen example.com), aber geladen von einer Website unter einer anderen Domäne (zB example.net).Kann ein auf einer anderen Domain gehostetes JavaScript das DOM einer anderen Domain lesen/ändern?

Nun stellen Sie sich vor, dass das geladene JavaScript nur Text in einer div mit einer bestimmten ID lesen/ändern wird, also nichts "kompliziert". Ein Beispiel: Ich habe das Skript von http://example.com/myscript.js geladen und ausgeführt auf http://example.net/index.html: [beachten Sie die verschiedenen TLD!]

<!-- Page example.net/index.html --> 
<script src="http://example.com/myscript.js"></script> 

Ich weiß, dass ich nicht Plätzchen unter mysite.com vom JavaScript zugreifen kann, aber ich kann auf das gesamte DOM auf der Seite zugreifen und es im Fall ändern. Ist das nicht ein mögliches Sicherheitsproblem? Sollte dies nicht den gleichen Ursprungspolicy-Schutz auslösen?

Gibt es Benutzeragenten, die verhindern, dass ein in einer anderen Domäne gehosteter JavaScript auf Elemente auf der Seite zugreift, auf der das Skript ausgeführt wird?

Und wird das obige Beispiel auch auf HTTPS-Seiten funktionieren? (Ex: https://example.net/index.html lädt das Skript von https://example.com/myscript.js)

Antwort

10

Alle URL basierte Sicherheitseinschränkungen in Client-Seite JavaScript auf der URL der Webseite basiert das <script> Element enthält, die die JS lädt.

Die URL, an der JS selbst gehostet wird, ist irrelevant.


Nun, ich weiß, dass ich nicht Plätzchen unter mysite.com vom JS zugreifen kann.

Das Skript wird in example.net geladen und gehostet auf example.com. Es kann Cookies von example.net lesen. Es kann keine Cookies von example.com lesen. (Der serverseitige Code unter example.com könnte das JavaScript dynamisch generieren und Daten einbetten, die aus Cookies stammen).


Aber kann ich alle DOM auf der Seite zuzugreifen, und im Fall, es zu ändern.

Ja

Ist das nicht eine mögliche Sicherheitsproblem? Sollte dies nicht den gleichen Ursprungspolicy-Schutz auslösen?

Dies ist ein potenzielles Sicherheitsproblem, aber es sollte nicht die gleiche Ursprungsrichtlinie auslösen.

Durch das Laden des Skripts vertraut der Autor der Seite der Website, die das Skript hostet.

JS nicht von Websites einbetten, denen Sie nicht vertrauen.


Und außerdem wird das obige Beispiel der Arbeit auch auf HTTPS-Seiten?(Ex: https://example.net/index.html lädt das Skript von https://example.com/myscript.js)

URLs mit verschiedenen Systemen haben unterschiedliche Ursprünge, wie URLs mit verschiedenen Host-Namen. Die gleichen Ursprungsrichtlinienregeln sind die gleichen wie sie auf Ursprung basieren, nicht auf bestimmten Merkmalen der Herkunft.

Manchmal erhalten Sie zusätzliche Einschränkungen, wenn eine über HTTPS geladene Seite den Zugriff auf Inhalte verweigert, die über HTTP geladen werden, da dies die SSL-Sicherheit unterbricht. Dies ist eine andere Sicherheitsbeschränkung, die nichts mit der gleichen Ursprungsrichtlinie zu tun hat.

+0

Ja, und genau deshalb werden CDNs verwendet, um js-Dateien zu laden. –

+0

Vielen Dank für die ausführliche Antwort. In Bezug auf Cookies, wenn ich ein "globales" Cookie von example.com setzen möchte (Cookie gesendet über den Set-Cookie-Header als Antwort, der das JS-Skript enthält), kann das von allen Seiten gelesen werden, die das Skript von example.com laden (die CDN), sollte ich davon ausgehen, dass dies unmöglich ist, oder? –

+0

Korrekt. Beachten Sie den Hinweis in der Antwort zur Verwendung von serverseitigem Code. – Quentin

3

Ist das nicht ein mögliches Sicherheitsproblem?

Ja, das nennt man Cross-Site-Scripting (XSS).

Es ist auf jeden Fall ein Sicherheitsproblem.

Endergebnis, nie Code enthalten, von jeder Domäne, der Sie nicht vertrauen. Ende der Geschichte.

Wenn ein Angreifer Code auf Ihrer Domain ausführen kann, ist dies ein Game-Over.

Sollte dies nicht den Schutz der gleichen Ursprungsrichtlinie auslösen?

Nr

Die Same Origin-Politik im Grunde bedeutet, dass das Skript immer nur das DOM der Domain anzeigen kann/ändern , auf die es wurde geladen. Sie können also keinen Iframe für eine beliebige Site erstellen und dieses DOM vom übergeordneten Element lesen, es sei denn, CORS ist aktiviert oder Ihr Skript wird auch dort ausgeführt.

Gibt es möglicherweise Benutzeragenten, die verhindern, dass ein Javascript, das auf einer anderen Domäne gehostet wird, auf Elemente auf der Seite zugreift, auf der das Skript ausgeführt wird?

Der einzige Weg, dies zu tun, ist, dass Javascript innerhalb eines iframe Sandbox, die auf einer anderen Domäne ist.

So könnten Sie eine sandbox.example.com Domain erstellen, die eine Wrapper-Seite generiert, die das Javascript enthält.

Erstellen Sie dann einen Iframe für die Sandbox-Domäne, anstatt direkt mit JS zu verknüpfen. Der JS hat Zugriff auf diese Domäne und alles in diesem DOM, aber nichts außerhalb des Iframes.

Sie müssen immer noch vorsichtig sein, Cookies richtig einzustellen (keine Wildcard-Domains usw.). Aber es kann helfen.