2015-09-08 11 views
22

मैं https: // URL का उपयोग करके iOS9 पर UIWebView में एक पृष्ठ लोड करने का प्रयास कर रहा हूं। लोड किए गए पृष्ठ में असुरक्षित सर्वर से सीएसएस और छवियां शामिल हैं।आईओएस 9 सुरक्षित पृष्ठ (एसएसएल/एचटीटीपीएस) से असुरक्षित संसाधन लोड नहीं करता है

उदा। पृष्ठ लोड: https: //www.example.com/ जो स्टाइलशीट http में शामिल हैं: //www.example: और छवि http //www.example.com/style.css .com/image.jpg

सब कुछ काम करता है, तो मूल पृष्ठ में असुरक्षित कनेक्शन (सामान्य http) के माध्यम से भरी हुई है। सब कुछ आईटी 8 पर एचटीटीपीएस और HTTP दोनों के माध्यम से भी काम करता है।

मैं NSAllowsArbitraryLoads आवेदन plist फ़ाइल में को NSAppTransportSecurityस्थापित किया था:

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

हालांकि जब HTTPS के माध्यम से पेज लोड हो रहा है, छवियों ठीक लोड किए गए हैं, लेकिन सीएसएस फ़ाइलें नहीं हैं। ऐसा लगता है कि UIWebView सुरक्षित पृष्ठ से असुरक्षित संसाधन लोड करने वाले ब्लॉक।

क्या UIWebView की कोई सेटिंग है जो असुरक्षित कनेक्शन के माध्यम से सीएसएस लोड करने की अनुमति देगी?

+0

आप एक [HSTS हैडर] जोड़ते हैं (https://developer.mozilla.org/en-US/docs/Web/Security/HTTP_strict_transport_security) ब्राउज़र अपने आप HTTPS के लिए अपने डोमेन के लिए सभी HTTP लिंक अपग्रेड कर देंगे (लेकिन आदर्श रूप में आपको लिंक भी ठीक करना चाहिए)। – Kornel

उत्तर

14

इस एटीएस से संबंधित नहीं है । वेबकिट एक मिश्रित सामग्री नीति लागू करता है जो "सक्रिय" सामग्री (जेएस, सीएसएस, आदि) के कुछ वर्गों तक पहुंच को असुरक्षित कनेक्शन पर लोड होने से वंचित करता है जब मेजबान पृष्ठ https पर प्रदर्शित किया जाता है।

यदि आप इंस्पेक्टर में अपने पृष्ठ की जांच करते हैं तो आपको यह त्रुटि पैनल में रिपोर्ट किया जाएगा।


अनुवर्ती: आप मिश्रित सामग्री अवरुद्ध नहीं कर सकते हैं। असुरक्षित सीएसएस या जेएस को अनुमति देने से पूरे पृष्ठ की सुरक्षा कम से कम सुरक्षित संसाधन तक कम हो जाती है। यदि आपको http पर css/js लोड करना है तो समाधान पूरे पृष्ठ को http पर लोड करना है। इस तरह उपयोगकर्ता द्वारा देखा गया यूआई सही ढंग से सामग्री की सुरक्षा को दर्शाता है।

+3

संशोधित प्रश्न के अनुवर्ती के रूप में: आप मिश्रित सामग्री अवरुद्ध नहीं कर सकते हैं। असुरक्षित सीएसएस या जेएस को अनुमति देने से पूरे पृष्ठ की सुरक्षा कम से कम सुरक्षित संसाधन तक कम हो जाती है। यदि आपको http पर सीएसएस/जेएस लोड करना है तो समाधान पूरे पृष्ठ को http पर लोड करना है। इस तरह उपयोगकर्ता द्वारा देखा गया यूआई सही ढंग से सामग्री की सुरक्षा को दर्शाता है। – Oliver

+0

चूंकि उत्तर मुझे असुरक्षित पृष्ठ से असुरक्षित सामग्री लोड करने के मुद्दे को हल करने की अनुमति नहीं देता है, यह समझाता है कि यह असंभव है। सही उत्तर के रूप में चिह्नित किया गया। – UrK

5

ऐप ट्रांसपोर्ट सुरक्षा आईओएस 9 रिलीज में संशोधित। अब आगे आपका एप्लिकेशन एक सुरक्षित कनेक्शन से सुरक्षित है। और आईओएस सुरक्षित कनेक्शन बनाने के लिए मजबूर करता है। यह आपके मामले में संघर्ष हो सकता है।

Apple documentation

से अपने अनुप्रयोग एक असुरक्षित डोमेन के लिए एक अनुरोध करने की जरूरत है, तो आप

तो मैं इस बारे में सोच को अपने ऐप्लिकेशन के Info.plist फ़ाइल में इस डोमेन को निर्दिष्ट करने के लिए है वेब पृष्ठों के लिए .css फ़ाइल लोड करते समय कोई समस्या हो सकती है।

तो एक info.plist में अपने डोमेन निर्दिष्ट कोशिश करते हैं और जाँच करें कि .css फाइल या लोड नहीं किए जाते हैं।

संपादित करें:


स्पॉटलाइट: info.plist में यहाँ और अधिक कुंजियों को जोड़ने की जरूरत है। इस कुंजी NSThirdPartyExceptionAllowsInsecureHTTPLoads इस पर

देखो एक सेवा डोमेन जो डेवलपर द्वारा नहीं नियंत्रित और पास असुरक्षित संसाधनों से करने के लिए परत ले जाने के लिए एक अपवाद जोड़ रहा है की अनुमति देता है।

अनुप्रयोग परिवहन सुरक्षा के लिए कुंजी को जोड़ने के लिए संरचना के नीचे है:

enter image description here

अधिक जानकारी और सभी कुंजियों के बारे में स्पष्टीकरण के लिए इस नोट की जांच - App Transport Security Technote

+0

बहिष्करण सूची ('NSIncludesSubdomains') में डोमेन जोड़ने से मदद नहीं मिली। दृश्य अभी भी एक सुरक्षित पृष्ठ के लिए असुरक्षित संसाधन लोड नहीं करता है। – UrK

+0

@Urk संपादित उत्तर – Kampai

9

अपने Info.plist में आप निम्न अनुप्रयोग परिवहन सुरक्षा कुंजियां जोड़ने की जरूरत:

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

उम्मीद है कि यह आपके लिए काम करना चाहिए।

+0

तो यह कैसे काम करना चाहिए यदि मेरे पृष्ठ के अंदर कई लिंक बाहरी स्रोत से कुछ डेटा को संदर्भित करते हैं और लोड करते हैं जो अतिरिक्त डोमेन से संबंधित नहीं है? – kokos8998

+0

यदि आप टीटीएस को एनटीएस का उपयोग नहीं करना चाहते हैं, तो आप बस अपने Info.plist में एनएसएएलओएसएर्बिटेरलोड्स को सही पर सेट कर सकते हैं। अन्यथा आपको उन सभी डोमेन को जोड़ना होगा जिन्हें आप लिंक कर रहे हैं। यहां एक अच्छा लिंक है जो इसे विवरण में बताता है http://www.neglectedpotential.com/2015/06/working-with-apples-plication-transport-security/ – ske57

0

Xcode 8.3.3 पर (8E3004b)

यह

App Transport Security Settings>Allow Arbitrary Loads in Web Content में बदल गया है>YES

enter image description here

-1

मैं वेबकिट उपकरण का उपयोग, लेकिन मैं लिंक नहीं खोल सकता कि एसएसएल (कुछ https लिंक) की अनुमति नहीं देता है और यह इस कोड द्वारा स्विफ्ट 4 पर काम करता है (आपको पहले प्रतिनिधि को घोषित करना होगा)

override func viewDidLoad() { 
    super.viewDidLoad() 

    let url = URL(string: currentAttach.fileUrl!) 
    let req = URLRequest(url:url!) 
    self.webView!.load(req) 
    self.webView.navigationDelegate = self 

    } 
} 

extension ViewController: WKNavigationDelegate{ 

    //MARK:- WKNavigationDelegate 
    //For Allow SSL https 
    func webView(_ webView: WKWebView, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) { 
     completionHandler(.useCredential, URLCredential(trust: challenge.protectionSpace.serverTrust!)) 
    } 

    func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) { 
     print(error.localizedDescription) 
    } 

    func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) { 
     print("Strat to load") 
     startLoading() 
    } 

    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { 
     print("finish to load") 
     stopLoading() 
    } 

} 
संबंधित मुद्दे