2015-09-08 11 views
22

Próbuję załadować stronę do UIWebView na iOS9 przy użyciu https: // URL. Strona ładowana zawiera CSS i obrazy z niezabezpieczonego serwera.iOS9 nie ładuje niezabezpieczonych zasobów z bezpiecznej strony (SSL/HTTPS)

E.g. strona załadowana: https: //www.example.com/ który zawiera stylów http: //www.example.com/style.css i obrazu http: //www.example .com/image.jpg

Wszystko działa, jeśli strona oryginalna jest ładowana przez niezabezpieczone połączenie (zwykły http). Wszystko działa również na iOS8 zarówno za pośrednictwem HTTPS, jak i HTTP.

zrobiłem ustawić NSAppTransportSecurity do NSAllowsArbitraryLoads w zgłoszeniu pliku PLIST:

<key>NSAppTransportSecurity</key> 
<dict> 
    <key>NSAllowsArbitraryLoads</key> 
    <true/> 
</dict> 

Choć podczas ładowania strony poprzez HTTPS, obrazy ładowane są OK, ale pliki CSS nie są. Wygląda na to, że UIWebView blokuje ładowanie niezabezpieczonych zasobów z bezpiecznej strony.

Czy istnieje ustawienie UIWebView, które pozwoli załadować CSS przez niezabezpieczone połączenie?

+0

Jeśli dodasz [nagłówek HSTS] (https://developer.mozilla.org/en-US/docs/Web/Security/HTTP_strict_transport_security) przeglądarka automatycznie uaktualni wszystkie linki HTTP do Twojej domeny do HTTPS (ale w idealnym przypadku powinieneś również poprawić linki). – Kornel

Odpowiedz

14

ten nie jest związany z ATS . WebKit wymusza, aby zasady mieszanej zawartości uniemożliwiające dostęp do określonych klas "aktywnej" zawartości (JS, CSS itp.) Były ładowane przez niezabezpieczone połączenie, gdy strona hosta jest obsługiwana przez https.

Jeśli sprawdzisz swoją stronę w Inspektorze, zobaczysz to w panelu błędów.


Uzupełnienie: Nie można wyłączyć blokowania treści mieszanych. Zezwalanie na niezabezpieczone arkusze CSS lub JS zmniejsza bezpieczeństwo całej strony do zawartości najbezpieczniejszego zasobu. Rozwiązaniem, jeśli musisz załadować css/js przez http jest załadowanie całej strony przez http. W ten sposób interfejs użytkownika widziany przez użytkownika poprawnie odzwierciedla bezpieczeństwo treści.

+3

Jako kontynuację zmodyfikowanego pytania: nie można wyłączyć blokowania mieszanych treści. Zezwalanie na niezabezpieczone arkusze CSS lub JS zmniejsza bezpieczeństwo całej strony do zawartości najbezpieczniejszego zasobu. Rozwiązaniem, jeśli musisz załadować css/js przez http jest załadowanie całej strony przez http. W ten sposób interfejs użytkownika widziany przez użytkownika poprawnie odzwierciedla bezpieczeństwo treści. – Oliver

+0

Jako że odpowiedź nie pozwala mi rozwiązać problemu ładowania niezabezpieczonej zawartości z niezabezpieczonej strony, wyjaśnia to, że jest to niemożliwe. Oznaczona jako poprawna odpowiedź. – UrK

5

Aplikacja Bezpieczeństwo transportu poprawiona w wersji iOS9. Teraz twoja aplikacja jest bezpieczna od niezabezpieczonego połączenia. A iOS wymusza bezpieczne połączenie. To może być konflikt w twoim przypadku.

Od Apple documentation

Jeśli Twoja aplikacja musi złożyć wniosek do domeny niezabezpieczone, trzeba określić tę domenę w Info.plist złożyć aplikacji

Więc myślę, że to może spowodować problem podczas wczytywania pliku .css dla stron internetowych.

Spróbuj więc podać swoją domenę pod numerem info.plist i sprawdź, czy załadowane są pliki .css.

Edit:


Spotlight: Trzeba dodać więcej kluczy tutaj w info.plist.

Spójrz na ten klucz NSThirdPartyExceptionAllowsInsecureHTTPLoads pozwala to na domenę usługi, która nie jest kontrolowana przez programistę i dodaj wyjątek do warstwy Transport, aby zabezpieczyć nieposiadające zasoby.

Struktura dodawania kluczy dla App Transportu Bezpieczeństwa jest poniżej:

enter image description here

Aby uzyskać więcej informacji i wyjaśnień na temat wszystkich kluczy sprawdzić tę notatkę - App Transport Security Technote

+0

Dodanie domeny do listy wykluczeń ('NSIncludesSubdomains') nie pomogło. widok nadal nie ładuje niezabezpieczonych zasobów dla bezpiecznej strony. – UrK

+0

@Urk Sprawdź edytowaną odpowiedź – Kampai

9

W swojej Info.plist trzeba dodać następujące klucze App zakresie bezpieczeństwa transportu:

NSAppTransportSecurity          Dictionary 
    NSAllowsArbitraryLoads         Boolean  YES 
    NSExceptionDomains          Dictionary  
     **YOUR-DOMAIN-HERE**        Dictionary 
      NSExceptionAllowsInsecureHTTPLoads    Boolean  YES 
      NSIncludesSubdomains       Boolean  YES 
      NSThirdPartyExceptionAllowsInsecureHTTPLoads Boolean  YES 

Mam nadzieję, że to powinien pracować dla Ciebie.

+0

Jak to powinno działać, jeśli na mojej stronie znajduje się kilka linków i ładuję niektóre dane ze źródła zewnętrznego, które nie dotyczą dodanej domeny?! – kokos8998

+0

Jeśli nie chcesz używać NTS, możesz po prostu ustawić wartość NSAllowsArbitraryLoads na wartość true w pliku Info.plist. W przeciwnym razie musisz dodać wszystkie domeny, z którymi się łączysz. Oto dobry link, który wyjaśnia to szczegółowo http://www.neglectedpotential.com/2015/06/working-with-apples-application-transport-security/ – ske57

0

Na Xcode 8.3.3 (8E3004b)

To zmieniło się

App Transport Security Settings>Allow Arbitrary Loads in Web Content>YES

enter image description here

-1

używam funkcji WebKit, ale nie mogę otworzyć link że ssl nie zezwala (niektóre linki https) i działa na swift4 tym kodem (musisz wcześniej zadeklarować delegowanie)

Powiązane problemy