2017-01-04 4 views
1

Hier ist die "Daten:" URI, laden Sie diese im Browser.Chrome vs Firefox Javascript Verhalten

data:text/html,<script>alert("#")</script> 

Ich bekomme Alert() in Chrome ausgeführt, aber nicht in Firefox. Firefox entfernt "#" Zeichen und alle folgenden Zeichen. Wie kann ich FF auf Alarm ("#") setzen?

Update: Ich verstehe das "#" Fragment Teil, aber die Frage ist eher wie "Warum ignoriert Chrome den" Fragment "-Fall und halte es für ein normales Zeichen, wenn FF nicht?".

Antwort

2

Der Datenteil eines Daten-URI muss codiert sein, # als Literalzeichen ist nicht zulässig. Vom Wikipedia page

Die Daten, die von dem vorhergehenden Teil durch ein Komma getrennt (,). Die Daten sind eine Folge von Oktetten, die als Zeichen dargestellt werden. Erlaubte Zeichen in einem Daten-URI sind die ASCII-Zeichen für die Groß- und Kleinbuchstaben des modernen englischen Alphabets und die arabischen Ziffern. Octets, die durch ein anderes Zeichen dargestellt werden, müssen in Prozent codiert sein, wie in %26 für ein Und-Zeichen (&).

... die RFC3986 zitiert.

Ihre Daten URI sollte also sein:

data:text/html,%3Cscript%3Ealert(%22%23%22)%3C%2Fscript%3E 

..., die in beiden Chrome und Firefox funktioniert:

<a href="data:text/html,%3Cscript%3Ealert(%22%23%22)%3C%2Fscript%3E">Click here</a>

Sie können die URI Daten von JavaScript erhalten mit encodeURIComponent, zB:

var dataUri = "data:text/html," + encodeURIComponent('<script>alert("#")</script>'); 
1

Eine # hat in einer URL eine besondere Bedeutung (sie zeigt den Anfang des Fragmentteils an). Sie müssen es als %23 kodieren, um es als Daten einzuschließen.

Verwandte Themen