การรักษาความปลอดภัยการขนส่งได้บล็อก HTTP ที่ซับซ้อน


1451

ฉันต้องตั้งค่าอะไรในinfo.plistการเปิดใช้งานโหมด HTTP ตามข้อความแสดงข้อผิดพลาดต่อไปนี้

การรักษาความปลอดภัยการขนส่งได้บล็อกการโหลดทรัพยากร HTTP (http: //) แบบ cleartext เนื่องจากไม่ปลอดภัย ข้อยกเว้นชั่วคราวสามารถกำหนดค่าผ่านทางไฟล์ Info.plist ของแอปของคุณ

Xcode

example.comสมมติว่าโดเมนของฉันคือ



15
ผู้ดำเนินรายการหมายเหตุ : มี 36 คำตอบสำหรับคำถามนี้แล้ว ก่อนที่จะเพิ่มอีกโปรดให้แน่ใจว่าวิธีการแก้ปัญหาของคุณใหม่
Matt

5
หมายเหตุ:แนวทางแก้ไขที่นี่แนะนำว่าคุณควรปิด ATS ( Allow arbitary loads) เร็ว ๆ นี้สิ่งนี้จะเป็นไปไม่ได้เนื่องจากApple จะต้องการ ATS (แต่เดิมสิ้นปี - ขยายกำหนดเวลา) - developer.apple.com/news/?id=12212016b
Jakub Truhlář


@Jeef ทำไมคุณเพิ่มแท็ก iOS 10 ใน iOS 10 มีการเปลี่ยนแปลงเพิ่มเติมหรือไม่? ฉันรู้สึกว่ามันถูกนำมาใช้ใน iOS9 และแท็กนั้นน่าจะเพียงพอสำหรับ iOS เวอร์ชัน
Julian Król

คำตอบ:


469

หากคุณใช้ Xcode 8.0+ และ Swift 2.2+ หรือแม้แต่ Objective C:

ป้อนคำอธิบายภาพที่นี่

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    <key>NSExceptionDomains</key>
    <dict>
        <key>example.com</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

29
ทำไมถึงNSAllowsArbitraryLoadsตั้งค่าtrue? คุณล้มล้างวัตถุประสงค์ของ ATS ยังเห็นรหัสที่อันตรายที่สุดในโลก: การตรวจสอบใบรับรอง SSL ในซอฟแวร์ที่ไม่ใช่เบราว์เซอร์ ซอฟต์แวร์ของคุณเพิ่งสร้างรายการ
jww

6
@jww นี่คือจุดประสงค์ของโพสต์นี้ ไซต์ที่ฉันต้องการเชื่อมต่อเพื่อเล่นเสียงยังไม่ได้ใช้ HTTPS และฉันไม่ได้รอ
ThinkDigital

5
สิ่งนี้จะไม่ทำงานใน iOS 10.0+ หรือ MacOS 10.12+ จริง ๆ แล้วมันบอกว่าอนุญาตให้โหลดได้ตามอำเภอใจทั้งหมดยกเว้นที่กล่าวถึง (example.com) ดังนั้นมันจะย้อนกลับของสิ่งที่ต้องการ NSAllowsArbirtraryLoads ควรตั้งค่าเป็นเท็จที่นี่ ข้อมูลเพิ่มเติม: Apple docs
Freek Sanders

1
เห็นด้วยทำไมทุกคนบนโลกถึงกำราบสิ่งนี้ ไม่มีจุดที่ใช้ NSAllowsArbitraryLoads หากคุณตั้งค่าโดเมนข้อยกเว้น
thibaut โนอาห์

1
NSAllowsArbitraryLoads ไม่จำเป็นต้องเป็นจริงดังนั้นจึงต้องลบออก NSExceptionDomains เพียงพอที่จะเปิดใช้งานการเชื่อมต่อที่ไม่ปลอดภัยกับโดเมนนั้นเท่านั้น NSAllowsArbitraryLoads = true จะเปิดใช้งานการเชื่อมต่อที่ไม่ปลอดภัยกับโดเมนใด ๆ ดังนั้นหากยังคงการตั้งค่าเป็นจริงทำให้ NSExceptionDomains ไร้สาระที่จะมีเพราะมันมีโดเมนทั้งหมดแล้ว
mister_giga

950

ใช้ NSAppTransportSecurity:

ป้อนคำอธิบายภาพที่นี่

คุณต้องตั้งค่าคีย์NSAllowsArbitraryLoadsเป็นYESภายใต้พจนานุกรมNSAppTransportSecurityในไฟล์ info.plist ของคุณ

การกำหนดค่า Plist


157
ปล่อยให้เป็นที่รู้จัก: นี่คือการหลีกเลี่ยงปัญหา! เมื่อใดก็ตามที่คุณใช้ HTTP ผ่าน HTTPS คุณจะเปิดช่องโหว่ของอุปกรณ์ของผู้ใช้ แน่นอนว่ามันไม่น่าเป็นไปได้ในหลายกรณี แต่การเขียนโปรแกรมเชิงจริยธรรมเป็นแนวปฏิบัติที่ดีที่สุด เพียงแค่พูดว่า '... - เช่นกัน +1 สำหรับการทำงาน (เพื่อจุดประสงค์ในการทดสอบ)
Jacksonkr

36
นี่ไม่ใช่วิธีแก้ปัญหา - นี่คือแฮ็ก! ในการเพิ่มแต่ละโดเมน "ข้อยกเว้น" ดูคำตอบนี้ด้านล่าง: stackoverflow.com/a/32560433/1103584
DiscDev

17
ในขณะที่การแก้ปัญหานี้เป็นที่รู้จักกันจะมีความเสี่ยงก็เป็นเพียงการแก้ปัญหาฉันจะแนะนำในระหว่างการพัฒนา การพิมพ์ทุกโดเมนที่ถูกต้องในระหว่างการพัฒนานั้นเป็นเรื่องโง่เง่า (โดยเฉพาะถ้าคุณใช้บริการเว็บของบุคคลที่สาม)
reTs

6
ชื่อของคีย์เหล่านั้นได้เปลี่ยนไปแล้วในตอนนี้ "การตั้งค่าความปลอดภัยในการขนส่งแอพ" ภายใต้ "อนุญาตให้โหลดโดยพลการ"
vishal dharankar

11
ทำไมคนจำนวนมากถึงใช้วิธีนี้? นี่ไม่ใช่แฮ็คอย่างแน่นอน! แอพจำนวนมากจำเป็นต้องสื่อสารกับอินเทอร์เน็ตจริงโดยที่โปรโตคอลความปลอดภัยไม่ได้อยู่ภายใต้การควบคุมของคุณ ตัวอย่างเช่นดูเหมือนว่าเหมาะสมที่จะแสดงภาพจากเซิร์ฟเวอร์อื่น ๆ ที่ไม่มีใบรับรอง SSL
Oren

825

นี่คือการตั้งค่าที่มองเห็นได้:

การตั้งค่าภาพสำหรับ NSAllowsArbitraryLoads ใน info.plist ผ่าน Xcode GUI


10
ฉันไม่มีทางเลือกนั้น
ผู้ใช้

25
หากคุณเปิด Info.plist โดยตรงคุณสามารถเพิ่มพจนานุกรมNSAppTransportSecurityแล้วสร้างรายการNSAllowsArbitraryLoadsภายในนั้น (ดูคำตอบที่แก้ไขโดย Umar Farooq ด้านล่าง)
Stoph

3
เหมือนกันที่นี่ - โดเมนยกเว้นไม่ทำงานกับ 7.3 สำหรับฉัน
RegularExpression

4
ตัวเลือกนี้ไม่มีอยู่ - XCode 7.3.1
jameshfisher

3
ข้อมูลจาก @JoshPinter ทำงานให้ฉันด้วย XCode 8
Matthew Bellantoni

717

ดูฟอรั่มที่โพสต์Application Transport Security? .

นอกจากนี้ยังมีหน้าข้อยกเว้นการกำหนดค่า App ขนส่งการรักษาความปลอดภัยใน iOS 9 และ OSX 10.11

ตัวอย่างเช่นคุณสามารถเพิ่มโดเมนเฉพาะเช่น:

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>example.com</key>
    <dict>
      <!--Include to allow subdomains-->
      <key>NSIncludesSubdomains</key>
      <true/>
      <!--Include to allow HTTP requests-->
      <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
      <true/>
      <!--Include to specify minimum TLS version-->
      <key>NSTemporaryExceptionMinimumTLSVersion</key>
      <string>TLSv1.1</string>
    </dict>
  </dict>
</dict>

ตัวเลือกที่ขี้เกียจคือ:

<key>NSAppTransportSecurity</key>
<dict>
  <!--Include to allow all connections (DANGER)-->
  <key>NSAllowsArbitraryLoads</key>
      <true/>
</dict>

บันทึก:

info.plist เป็นไฟล์ XML เพื่อให้คุณสามารถวางรหัสนี้ในที่ใดก็ได้ภายในไฟล์


1
ฉันจะทำอย่างนั้นได้ฉันหมายถึงวิธีเพิ่มรหัสนี้ใน Info.plist เพราะฉันไม่ทราบว่าจะวางรหัสนี้อย่างไร
lmiguelvargasf

2
@lmiguelvargasf เปิดข้อมูลของคุณในโปรแกรมแก้ไขข้อความธรรมดา
Dan Beaulieu

7
ฉันยังคงได้รับข้อผิดพลาด: มีการตั้งค่าโดเมนข้อยกเว้นและ NSAllowsArbitraryLoads เป็นเท็จ ถึงแม้จะมีการตั้งค่า NSAllowsArbitraryLoads จริงข้อผิดพลาดจะปรากฏขึ้น ใครที่นี่มีปัญหานี้หรือไม่
klaevv

3
ตั้งแต่วันที่ 1/30/2016 แอปเปิ้ล doc แสดงให้เห็นว่ากุญแจไม่มีคำชั่วคราวอยู่ในนั้นอีกต่อไปเช่น: NSExceptionAllowsInsecureHTTPLoads NSExceptionMinimumTLSVersion ดูdeveloper.apple.com/library/prerelease/ios/documentation/…
Philippe Monnet

3
ในกรณีที่คนอื่นกำลังดึงผมออกมาเพราะการเปลี่ยนแปลงที่ง่าย ๆ กับ info.plist ไม่ทำงาน .. เพิ่มการเปลี่ยนแปลงในโครงการ> เป้าหมาย> ข้อมูล> คุณสมบัติเป้าหมาย iOS ที่กำหนดเอง
BlueGuy

330

สิ่งนี้ได้รับการทดสอบและทำงานบนเมล็ดพันธุ์ GM 9 ของ iOS - นี่คือการกำหนดค่าเพื่ออนุญาตให้โดเมนเฉพาะใช้ HTTP แทน HTTPS:

<key>NSAppTransportSecurity</key>
<dict>
      <key>NSAllowsArbitraryLoads</key> 
      <false/>
       <key>NSExceptionDomains</key>
       <dict>
            <key>example.com</key> <!--Include your domain at this line -->
            <dict>
                <key>NSIncludesSubdomains</key>
                <true/>
                <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
                <true/>
                <key>NSTemporaryExceptionMinimumTLSVersion</key>
                <string>TLSv1.1</string>
            </dict>
       </dict>
</dict>

NSAllowsArbitraryLoadsต้องเป็นfalseเพราะมันไม่อนุญาตให้มีการเชื่อมต่อที่ไม่ปลอดภัยทั้งหมดแต่รายการข้อยกเว้นอนุญาตการเชื่อมต่อกับบางโดเมนที่ไม่มี HTTPS


7
ควรทำเครื่องหมายเป็นคำตอบ ทดสอบและทำงานบนเมล็ดพันธุ์ GM 9 ของ iOS เพื่ออนุญาตให้โดเมนเฉพาะใช้ http โดยไม่ต้องใช้วิธี "ขี้เกียจ" และเปิดแอปของคุณอย่างสมบูรณ์
DiscDev

2
ฉันจะเพิ่มสิ่งนี้ลงในข้อมูลของฉันได้อย่างไร
JMStudios.jrichardson

8
ตกลงฉันได้เพิ่มรายการนั้นลงใน info.plist ของฉันแล้วและฉันยังคงได้รับข้อผิดพลาดนี้ - "ความปลอดภัยในการขนส่งของแอปได้บล็อกการโหลดทรัพยากร HTTP (http: //) ของ cleartext เนื่องจากไม่ปลอดภัยสามารถยกเว้นการกำหนดค่าชั่วคราวได้ ไฟล์. plist "
KMC

2
@RomanShapovalov หากคุณต้องใช้ที่อยู่ IP ลองเพิ่ม. xip.io ที่ส่วนท้ายของที่อยู่ IP และเพิ่ม xip.io ไปยัง NSExceptionDomains ของคุณ ดูxip.io ฉันเชื่อมต่อโดยตรงกับไอพีเมื่อพัฒนา (แต่ไม่ปล่อย) และมันก็ใช้ได้ดีสำหรับฉัน
tpankake

2
ไม่ได้ทำงานให้ฉันจนกว่าฉันจะรู้ตัวว่าใส่ข้อมูลผิดไปในโครงการทดสอบของฉัน ตรวจสอบให้แน่ใจว่าคุณใส่ไว้ในสิ่งที่ถูกต้อง!
Chucky

144

นี่เป็นวิธีแก้ปัญหาอย่างรวดเร็ว (แต่ไม่แนะนำ) เพื่อเพิ่มใน Plist:

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

ซึ่งหมายความว่า (ตามเอกสารของ Apple ):

NSAllowsArbitraryLoads
ค่าบูลีนที่ใช้เพื่อปิดใช้งาน App Transport Security สำหรับโดเมนใด ๆ ที่ไม่อยู่ในพจนานุกรม NSExceptionDomains รายชื่อโดเมนใช้การตั้งค่าที่ระบุสำหรับโดเมนนั้น

ค่าเริ่มต้นของ NO ต้องใช้พฤติกรรมความปลอดภัยการขนส่งของแอพเริ่มต้นสำหรับการเชื่อมต่อทั้งหมด

ฉันแนะนำลิงค์:

ซึ่งช่วยให้ฉันเข้าใจเหตุผลและความหมายทั้งหมด

XML (ในไฟล์ Info.plist) ด้านล่างจะ:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <false/>
    <key>NSExceptionDomains</key>
    <dict>
        <key>PAGE_FOR_WHICH_SETTINGS_YOU_WANT_TO_OVERRIDE</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
        </dict>
    </dict>
</dict>

ไม่อนุญาตให้โทรทุกหน้า แต่PAGE_FOR_WHICH_SETTINGS_YOU_WANT_TO_OVERRIDEจะอนุญาตให้การเชื่อมต่อนั้นใช้โปรโตคอล HTTP

สำหรับ XML ด้านบนคุณสามารถเพิ่ม:

<key>NSIncludesSubdomains</key>
<true/>

หากคุณต้องการอนุญาตการเชื่อมต่อที่ไม่ปลอดภัยสำหรับโดเมนย่อยของที่อยู่ที่ระบุ

วิธีที่ดีที่สุดคือการบล็อกการโหลดโดยพลการทั้งหมด (ตั้งค่าเป็นเท็จ) และเพิ่มข้อยกเว้นเพื่ออนุญาตเฉพาะที่อยู่ที่เรารู้ว่าใช้ได้

สำหรับผู้อ่านที่สนใจ

ปรับปรุง 2018:

Apple ไม่แนะนำให้ปิดการทำงานนี้ - สามารถดูข้อมูลเพิ่มเติมได้ใน207 เซสชัน WWDC 2018พร้อมอธิบายเพิ่มเติมเกี่ยวกับความปลอดภัย

ออกคำตอบดั้งเดิมด้วยเหตุผลทางประวัติศาสตร์และขั้นตอนการพัฒนา


1
NSAllowsArbitraryLoadsต้องเป็นfalse
Sound Blaster

@SoundBlaster สำหรับกรณีใดและสิ่งที่คุณเห็นผิดในคำตอบของฉันเพื่อลงคะแนน
Julian Król

โดยการเพิ่ม plist (NSAppTransportSecurity NSAllowsArbitraryLoads) บริการเว็บทั้งหมดทำงานได้ดียกเว้นบริการเว็บหนึ่งบริการเว็บหนึ่งบริการเว็บหนึ่งส่งคืนข้อผิดพลาดเซิร์ฟเวอร์ภายใน (500) ใน iOS 9 แต่ทำงานได้ดีใน iOS8 หรือใหม่กว่า
amit gupta

@SoundBlaster ทำการเปลี่ยนแปลงตอนนี้คุณไม่ควรมีการคัดค้าน :)
จูเลียนKról

ขอบคุณคุณเพิ่มจริง ๆ ได้<key>NSIncludesSubdomains</key> <true/>อย่างไร การตั้งค่าทุกอย่างต้องล้อมรอบด้วย<dict>หรือไม่? คุณจะแก้ไขไฟล์ plist นี้ได้อย่างไร การจัดรูปแบบคืออะไร : D ขอบคุณ
Agent Zebra

116

สำหรับผู้ที่ต้องการบริบทเพิ่มเติมเกี่ยวกับสาเหตุที่เกิดขึ้นนอกเหนือจากวิธีการแก้ไขแล้วอ่านด้านล่าง

ด้วยการแนะนำของ iOS 9 เพื่อปรับปรุงการรักษาความปลอดภัยของการเชื่อมต่อระหว่างแอปและเว็บบริการรักษาความปลอดภัยการเชื่อมต่อระหว่างแอปและบริการเว็บที่จะต้องปฏิบัติตามวิธีปฏิบัติที่ดีที่สุด พฤติกรรมการปฏิบัติที่ดีที่สุดนั้นบังคับใช้โดยApp Transport Securityเพื่อ:

  • ป้องกันการเปิดเผยโดยไม่ตั้งใจและ
  • จัดเตรียมพฤติกรรมเริ่มต้นที่ปลอดภัย

ตามที่อธิบายไว้ในApp Transport Security Technoteเมื่อสื่อสารกับบริการเว็บของคุณตอนนี้ App Transport Security มีข้อกำหนดและพฤติกรรมดังต่อไปนี้:

  • เซิร์ฟเวอร์ต้องรองรับโปรโตคอล Transport Layer Security (TLS) อย่างน้อย 1.2 เวอร์ชัน
  • ยันต์การเชื่อมต่อจะถูก จำกัด ไว้ที่สิ่งที่ให้ความลับไปข้างหน้า (ดูรายการของยันต์ด้านล่าง)
  • ใบรับรองจะต้องลงนามโดยใช้อัลกอริทึมแฮชลายเซ็นที่ดีกว่าด้วยทั้งคีย์ 2048 บิตหรือมากกว่า RSA หรือคีย์ 256 บิตหรือมากกว่า Elliptic-Curve (ECC)
  • ใบรับรองที่ไม่ถูกต้องส่งผลให้เกิดความล้มเหลวอย่างหนักและไม่มีการเชื่อมต่อ

กล่าวคือคำขอบริการเว็บของคุณควร: a.) ใช้HTTPSและ b.) เข้ารหัสโดยใช้ TLS v1.2 พร้อมกับส่งต่อความลับ

อย่างไรก็ตามดังที่ได้กล่าวไว้ในโพสต์อื่นคุณสามารถแทนที่พฤติกรรมใหม่นี้ได้จาก App Transport Security โดยการระบุโดเมนที่ไม่ปลอดภัยในInfo.plistแอพของคุณ


เพื่อแทนที่คุณจะต้องเพิ่มNSAppTransportSecurity> คุณสมบัติพจนานุกรมของคุณNSExceptionDomains Info.plistถัดไปคุณจะเพิ่มโดเมนของบริการบนเว็บลงในNSExceptionDomainsพจนานุกรม

ตัวอย่างเช่นถ้าฉันต้องการหลีกเลี่ยงพฤติกรรมการขนส่งความปลอดภัยของแอปสำหรับบริการบนเว็บในโฮสต์www.yourwebservicehost.comฉันจะทำสิ่งต่อไปนี้:

  1. เปิดแอปของคุณใน Xcode

  2. ค้นหาInfo.plistไฟล์ใน Project Navigator และคลิกขวาที่ไฟล์แล้วเลือกตัวเลือกเมนูเปิดเป็น > รหัสที่มา ไฟล์รายการคุณสมบัติจะปรากฏในบานหน้าต่างด้านขวา

  3. วางบล็อกคุณสมบัติต่อไปนี้ไว้ภายในพจนานุกรมคุณสมบัติหลัก (ใต้อันแรก<dict>)


<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>www.example.com</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSExceptionMinimumTLSVersion</key>
            <string>TLSv1.1</string>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

NSExceptionDomainsหากคุณต้องการที่จะให้ข้อยกเว้นสำหรับโดเมนเพิ่มเติมแล้วคุณจะเพิ่มคุณสมบัติอื่นพจนานุกรมใต้

เพื่อหาข้อมูลเพิ่มเติมเกี่ยวกับกุญแจที่อ้างถึงข้างต้นโปรดอ่านtechnote ที่กล่าวถึงนี้


1
สิ่งนี้ทำงานได้ใน 2 แอพของฉัน แต่มันไม่ทำงานในแอปที่ 3 มีบุคคลอื่นประสบสถานการณ์การใช้การแก้ไขด้านบนและยังได้รับข้อความแสดงข้อผิดพลาดเดียวกัน (และใช่ฉันอัปเดตพจนานุกรมเพื่อใช้โดเมน API ของฉันไม่ใช่ที่อยู่ในรหัส)
helloB

ดีที่สุด! Apple ยืนยันว่าโซลูชันนี้ใช้
YannSteph

สิ่งนี้ใช้ได้./platforms/ios/<project>/<project>-Info.plistกับไฟล์แก้ไขแอป Cordova / Phonegap / Ionic ที่มีNSAllowsArbitraryLoads=falseและโดเมนข้อยกเว้นจำนวนมากสำหรับบริการที่มีชุดค่าผสม TLS / HTTP / HTTPS ที่แตกต่างกัน เริ่มใช้งานNSAllowsArbitraryLoads=trueแล้วปรับแก้ปัญหากฎผ่านการทดลองและข้อผิดพลาดเพื่อให้สอดคล้องกับแนวทางและส่งเพื่อขออนุมัติ ข้อความconfig.xml <access origin=.../>สั่งหมายเหตุเติมข้อมูลในไฟล์บางส่วน แต่ในปัจจุบันจำเป็นต้องมีการปรับเปลี่ยนโดยแก้ไขโดยตรงหรือผ่าน XCode เพื่อให้ได้รายละเอียดที่ถูกต้อง
jimmont

นอกจากนี้<access origin="*"/>(ใน config.xml) ตั้งค่าNSAllowsArbitraryLoads=true(สำหรับแอพ Cordova / Phonegap / ไฮบริด
jimmont

ทำไมถึงNSExceptionAllowsInsecureHTTPLoadsตั้งค่าtrue? คุณล้มล้างวัตถุประสงค์ของ ATS ยังเห็นรหัสที่อันตรายที่สุดในโลก: การตรวจสอบใบรับรอง SSL ในซอฟแวร์ที่ไม่ใช่เบราว์เซอร์ ซอฟต์แวร์ของคุณเพิ่งสร้างรายการ
jww

67

ฉันไม่ชอบแก้ไขการวางแผนโดยตรง คุณสามารถเพิ่มลงใน plist ได้อย่างง่ายดายโดยใช้ GUI:

  • คลิกที่ Info.plist ในนาวิเกเตอร์ด้านซ้าย
  • ตอนนี้เปลี่ยนข้อมูลในพื้นที่หลัก:

    • ในบรรทัดสุดท้ายให้เพิ่ม +
    • ป้อนชื่อของกลุ่ม: การตั้งค่าความปลอดภัยของการขนส่งแอป
    • คลิกขวาที่กลุ่มและเลือก Add Row
    • ป้อนอนุญาตให้โหลดโดยพลการ
    • ตั้งค่าทางด้านขวาเป็นYES

ตัวอย่าง


ในการชี้แจง: หาก "อนุญาตให้โหลดโดยพลการ" เป็นใช่และมี "โดเมนข้อยกเว้น" การโหลดที่ได้รับอนุญาตจะถูก จำกัด เฉพาะกับที่อยู่ในโดเมนการยกเว้น ถูกต้องไหม

เป็นวิธีที่ปลอดภัยหรือไม่หากฉันต้องการปล่อยแอปพลิเคชัน
Lamour

ไม่ได้ด้วยการอนุญาตให้โหลดโดยพลการแอปของคุณสามารถเชื่อมต่อกับโดเมนใด ๆ ได้อย่างอิสระ ในมุมมองด้านความปลอดภัยคุณควรควบคุมและ จำกัด โดเมน / เว็บไซต์ที่แอพควรเชื่อมต่อเพื่อหลีกเลี่ยงการใช้เครือข่ายที่ไม่คาดคิด
Raptor

แอพส่วนใหญ่จะส่งไปยังเซิร์ฟเวอร์ที่รู้จักเท่านั้น สิ่งนี้ถูกควบคุมโดยผู้พัฒนา ดังนั้นปัญหาความปลอดภัยจึงเป็นที่รู้จัก
Vincent

ทำไมถึงNSAllowsArbitraryLoadsตั้งค่าYES? คุณล้มล้างวัตถุประสงค์ของ ATS ยังเห็นรหัสที่อันตรายที่สุดในโลก: การตรวจสอบใบรับรอง SSL ในซอฟแวร์ที่ไม่ใช่เบราว์เซอร์ ซอฟต์แวร์ของคุณเพิ่งสร้างรายการ
jww

25

เอกสาร Apple 1

เอกสาร Apple 2

มีสองวิธีสำหรับการนี้:

โซลูชันที่ 1:

  1. ในInfo.plistไฟล์เพิ่มพจนานุกรมด้วยปุ่ม ' NSAppTransportSecurity'
  2. เพิ่มองค์ประกอบอื่นภายในพจนานุกรมด้วยคีย์ 'Allow Arbitrary Loads'

Plist โครงสร้างควรปรากฏดังแสดงในภาพด้านล่าง

โซลูชันที่ 1

โซลูชันที่ 2:

  1. ในInfo.plistไฟล์เพิ่มพจนานุกรมด้วยปุ่ม ' NSAppTransportSecurity'
  2. เพิ่มองค์ประกอบอื่นในพจนานุกรมด้วยปุ่ม ' NSExceptionDomains'
  3. เพิ่มองค์ประกอบด้วยรหัส'MyDomainName.com'ประเภท NSDictionary
  4. เพิ่มองค์ประกอบพร้อมคีย์ ' NSIncludesSubdomains' ของประเภทBooleanและค่าที่ตั้งเป็นYES
  5. เพิ่มองค์ประกอบพร้อมคีย์ ' NSTemporaryExceptionAllowsInsecureHTTPLoads' ของประเภทBooleanและค่าที่ตั้งเป็นYES

Plist โครงสร้างควรปรากฏดังแสดงในภาพด้านล่าง

โซลูชันที่ 2

โซลูชันที่ 2 เป็นที่ต้องการเนื่องจากอนุญาตเฉพาะโดเมนที่เลือกขณะที่โซลูชัน 1 อนุญาตการเชื่อมต่อ HTTP ที่ไม่ปลอดภัยทั้งหมด


ทำไมถึงNSAllowsArbitraryLoadsตั้งค่าYES? คุณล้มล้างวัตถุประสงค์ของ ATS ยังเห็นรหัสที่อันตรายที่สุดในโลก: การตรวจสอบใบรับรอง SSL ในซอฟแวร์ที่ไม่ใช่เบราว์เซอร์ ซอฟต์แวร์ของคุณเพิ่งสร้างรายการ
jww

20

ความปลอดภัยในการขนส่งมีให้ใน iOS 9.0 หรือใหม่กว่า คุณอาจมีคำเตือนนี้เมื่อพยายามเรียก WS ภายในแอปพลิเคชันของคุณ:

Application Transport Security ได้บล็อกการโหลดทรัพยากร cleartext HTTP (http: //) เนื่องจากไม่ปลอดภัย ข้อยกเว้นชั่วคราวสามารถกำหนดค่าผ่านทางไฟล์ Info.plist ของแอปของคุณ

การเพิ่มสิ่งต่อไปนี้ใน Info.plist ของคุณจะปิดการใช้งาน ATS:

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

1
NSAllowsArbitraryLoads จะต้องเป็นเท็จหากเป็นจริงจะอนุญาตการเชื่อมต่อที่ไม่ปลอดภัยทั้งหมด
Thiago Arreguy

โดยเพิ่มบริการเว็บที่ทำงานได้ดีทั้งหมดยกเว้นบริการเว็บหนึ่งบริการเว็บหนึ่งคืนข้อผิดพลาดเซิร์ฟเวอร์ภายใน (500) ใน iOS 9 แต่ทำงานได้ดีใน iOS8 หรือใหม่กว่า
amit gupta

1
ได้รับการยอมรับในร้านค้า?
Vrashabh Irde

คำแนะนำที่แย่มาก ดูรหัสที่อันตรายที่สุดในโลก: การตรวจสอบใบรับรอง SSL ในซอฟแวร์ที่ไม่ใช่เบราว์เซอร์ ให้คำถามถ้าเต็มไปด้วยวิธีที่แนะนำในการทำสิ่งต่าง ๆ คำตอบ "ฉันด้วย" ไม่จำเป็นเช่นนี้
jww

15

ตัวอย่างการพัฒนา

นี่คือภาพหน้าจอของ plist ซึ่งช่วยให้ ATS เหมือนเดิม (= ปลอดภัย) แต่ช่วยว่าการเชื่อมต่อกับlocalhostสามารถทำผ่านทางHTTP HTTPS มันทำงานได้ใน Xcode 7.1.1

ป้อนคำอธิบายภาพที่นี่


มีวิธีใดบ้างที่จะทำให้ localhost มีความปลอดภัยเช่นใช้ HTTPS ในแบบตอบสนองดั้งเดิมเพื่อให้เราไม่ต้องใช้การกำหนดค่าเริ่มต้นNSExceptionAllowsInsecureHTTPLoads - YESหรือไม่
milkersarac

13

ไปที่ Info.plist ของคุณ

  1. คลิกขวาบนพื้นที่ว่างและคลิกที่เพิ่มแถว
  2. เขียนชื่อคีย์เป็น NSAppTransportSecurity ภายใต้
  3. เลือกโดเมนข้อยกเว้นเพิ่มรายการใหม่ลงในรายการนี้
  4. จดชื่อโดเมนของคุณที่จำเป็นต้องเข้าถึง
  5. เปลี่ยนประเภทโดเมนจากสตริงเป็นพจนานุกรมเพิ่มรายการใหม่
  6. NSTemporaryExceptionAllowsInsecureHTTPLoads ซึ่งจะเป็นบูลีนที่มีค่าจริง ดูภาพเพื่อติดตามอย่างถูกต้อง

1
ทำไมถึงNSAllowsArbitraryLoadsตั้งค่าtrue? คุณล้มล้างวัตถุประสงค์ของ ATS ยังเห็นรหัสที่อันตรายที่สุดในโลก: การตรวจสอบใบรับรอง SSL ในซอฟแวร์ที่ไม่ใช่เบราว์เซอร์ ซอฟต์แวร์ของคุณเพิ่งสร้างรายการ
jww

13

ตามที่ Apple กล่าวโดยทั่วไปการปิดใช้งาน ATS จะนำไปสู่การปฏิเสธแอปเว้นแต่ว่าคุณมีเหตุผลที่ดี แม้ว่าคุณควรเพิ่มข้อยกเว้นสำหรับโดเมนที่คุณสามารถเข้าถึงได้อย่างปลอดภัย

Apple มีเครื่องมือที่ยอดเยี่ยมที่จะบอกคุณว่าการตั้งค่าที่จะใช้: ใน Terminal ให้ป้อน

/usr/bin/nscurl --ats-diagnostics --verbose https://www.example.com/whatever

และ nscurl จะตรวจสอบว่าคำขอนี้ล้มเหลวหรือไม่จากนั้นลองใช้การตั้งค่าที่หลากหลายและบอกให้คุณทราบว่ารายการใดผ่านและสิ่งที่ต้องทำ ตัวอย่างเช่นสำหรับ URL บุคคลที่สามที่ฉันเยี่ยมชมคำสั่งนี้บอกฉันว่าพจนานุกรมนี้ผ่าน:

{
    NSExceptionDomains = {
        "www.example.com" = {
            NSExceptionRequiresForwardSecrecy = false;
        };
    };
}

เมื่อต้องการแยกความแตกต่างระหว่างไซต์ของคุณและไซต์ของบุคคลที่สามซึ่งอยู่นอกเหนือการควบคุมของคุณให้ใช้ตัวอย่างเช่นคีย์ NSThirdPartyExceptionRequiresForwardSecrecy


1
เครื่องมือที่ยอดเยี่ยมในการตรวจสอบก่อนทดสอบจริงกับแอปพลิเคชัน ประหยัดเวลา. แต่ทรัพยากรใด ๆ ที่จะอ่านเพื่อทำความเข้าใจกับคำสั่งนี้
damithH

1
เครื่องมือที่น่าสนใจ ในกรณีของฉันมันเกินสิ่งต่าง ๆ แม้ว่า มันแสดงรายการสามปุ่มรวมถึงNSExceptionAllowsInsecureHTTPLoads = true;แต่ปรากฎว่าไม่จำเป็น
คริสเจ้าชาย

11

การพิจารณาว่าการตั้งค่าใดที่จะใช้สามารถทำได้โดยอัตโนมัติดังที่ได้กล่าวไว้ในเทคโน้ตนี้ :

/usr/bin/nscurl --ats-diagnostics --verbose https://your-domain.com

คุณต้องการ OS X 10.11 (El Capitan) สำหรับสิ่งนี้
ecotax

10

หมายเหตุ: โดเมนข้อยกเว้นในการวางแผนของคุณควรอยู่ใน LOWER-CASE

ตัวอย่าง: คุณตั้งชื่อเครื่องของคุณ "MyAwesomeMacbook" ภายใต้การตั้งค่า -> การแบ่งปัน; เซิร์ฟเวอร์ของคุณ (เพื่อจุดประสงค์ในการทดสอบ) กำลังทำงานบน MyAwesomeMacbook.local: 3000 และแอปของคุณต้องส่งคำขอไปที่http: //MyAwesomeMacbook.local: 3000 / ไฟล์ ... คุณจะต้องระบุ "myawesomemacbook" ท้องถิ่น "เป็นโดเมนข้อยกเว้น

-

info.plist ของคุณจะมี ...

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>myawesomemacbook.local</key>
    <dict>
      <!--Include to allow subdomains-->
      <key>NSIncludesSubdomains</key>
      <true/>
      <!--Include to allow HTTP requests-->
      <key>NSExceptionAllowsInsecureHTTPLoads</key>
      <true/>
    </dict>
  </dict>
</dict>

9

ใช้:

หน้าจอ PList เพื่อทำความเข้าใจให้ดีขึ้น

เพิ่มรายการใหม่NSAppTransportSecurityในไฟล์ plist กับประเภทพจนานุกรมแล้วเพิ่มรายการย่อยNSAllowsArbitraryLoadsในพจนานุกรมของประเภทบูลีนและชุดบูลค่าใช่ มันใช้งานได้สำหรับฉัน


1
NSAllowsArbitraryLoads จะต้องเป็นเท็จถ้าเป็นจริงจะช่วยให้การเชื่อมต่อที่ไม่ปลอดภัยทั้งหมด
Thiago Arreguy

โดยการเพิ่มบริการเว็บทั้งหมดให้ทำงานได้ดียกเว้นบริการบนเว็บหนึ่งบริการเว็บหนึ่งส่งคืนข้อผิดพลาดเซิร์ฟเวอร์ภายใน (500) ใน iOS 9 แต่ทำงานได้ดีใน iOS8 หรือใหม่กว่า @ThiagoArreguy
amit gupta

คำแนะนำที่แย่มาก ดูรหัสที่อันตรายที่สุดในโลก: การตรวจสอบใบรับรอง SSL ในซอฟแวร์ที่ไม่ใช่เบราว์เซอร์ ให้คำถามถ้าเต็มไปด้วยวิธีที่แนะนำในการทำสิ่งต่าง ๆ คำตอบ "ฉันด้วย" ไม่จำเป็นเช่นนี้
jww

ฉันรู้ว่ามันเป็นคำแนะนำที่ไม่ดี แต่มันเป็นเพียงวิธีแก้ปัญหาสำหรับเวลาที่อยู่ในโหมดการพัฒนาเท่านั้น Apple ให้ความยืดหยุ่นแก่เราถ้ามันแย่มากพวกเขาก็ไม่อนุญาต
Tejinder

9

ใน 2015-09-25 (หลังจากอัปเดต Xcode เมื่อวันที่ 2015-09-18):

ฉันใช้วิธีที่ไม่ขี้เกียจ แต่ก็ไม่ได้ผล ต่อไปนี้เป็นความพยายามของฉัน

ครั้งแรก

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>www.xxx.yyy.zzz</key>
        <dict>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSTemporaryExceptionMinimumTLSVersion</key>
            <string>TLSv1.1</string>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

และประการที่สอง

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>www.xxx.yyy.zzz</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSExceptionMinimumTLSVersion</key>
            <string>TLSv1.1</string>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

ในที่สุดฉันใช้วิธีขี้เกียจ:

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

อาจไม่ปลอดภัยเล็กน้อย แต่ฉันไม่พบวิธีแก้ไขปัญหาอื่น ๆ


ทำไมถึงNSAllowsArbitraryLoadsตั้งค่าtrue? คุณล้มล้างวัตถุประสงค์ของ ATS ยังเห็นรหัสที่อันตรายที่สุดในโลก: การตรวจสอบใบรับรอง SSL ในซอฟแวร์ที่ไม่ใช่เบราว์เซอร์ ซอฟต์แวร์ของคุณเพิ่งสร้างรายการ
jww

9

ใน swift 4 และ xocde 10 จะเปลี่ยน NSAllowsArbitraryLoads เป็น Allow Arbitrary Loads ดังนั้นมันจะเป็นแบบนี้:

<key>App Transport Security Settings</key>
<dict>
     <key>Allow Arbitrary Loads</key><true/>
</dict>

6

มันอาจจะคุ้มค่าที่จะกล่าวถึงวิธีเดินทาง ...

Info.plist เป็นหนึ่งในไฟล์ด้านล่าง Main.storyboard หรือ viewController.swift

เมื่อคุณคลิกที่นี่เป็นครั้งแรกมักจะอยู่ในรูปแบบตารางดังนั้นให้คลิกขวาที่ไฟล์และ 'เปิดเป็น' ซอร์สโค้ดแล้วเพิ่มรหัสด้านล่างต่อท้ายเช่น:

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

คัดลอกวางรหัสด้านบน

 "</dict>
</plist>"

ซึ่งเป็นที่สิ้นสุด


ทำไมถึงNSAllowsArbitraryLoadsตั้งค่าtrue? คุณล้มล้างวัตถุประสงค์ของ ATS ยังเห็นรหัสที่อันตรายที่สุดในโลก: การตรวจสอบใบรับรอง SSL ในซอฟแวร์ที่ไม่ใช่เบราว์เซอร์ ซอฟต์แวร์ของคุณเพิ่งสร้างรายการ
jww

5

อัปเดตสำหรับ Xcode 7.1 เผชิญปัญหา 27.10.15:

ค่าใหม่ใน Info.plist คือ "การตั้งค่าความปลอดภัยของการขนส่งแอพ" จากตรงนี้พจนานุกรมนี้ควรมี:

  • อนุญาตให้โหลดโดยพลการ = YES
  • โดเมนการยกเว้น (แทรกโดเมน http ของคุณที่นี่)

4

สำหรับผู้ที่มาที่นี่พยายามค้นหาสาเหตุที่ WKWebView ของตนเป็นสีขาวเสมอและไม่ต้องโหลดอะไรเลย (อย่างที่อธิบายไว้ที่นี่ฉันจะให้ WKWebView ทำงานอย่างรวดเร็วและเป็น macOS App ) ได้อย่างไร:

หากวิทยาศาสตร์จรวดทั้งหมดข้างต้นไม่ทำงานให้คุณตรวจสอบอย่างชัดเจน: การตั้งค่ากล่องทราย

การตั้งค่าแซนด์บ็อกซ์]

เป็นคนใหม่ที่รวดเร็วและโกโก้ แต่มีประสบการณ์ค่อนข้างดีในการเขียนโปรแกรมฉันใช้เวลาประมาณ 20 ชั่วโมงในการหาวิธีแก้ปัญหานี้ ไม่มีคำแนะนำ hipster-iOS- แบบฝึกหัดและการกล่าวสุนทรพจน์ของ Apple - ไม่มีอะไรพูดถึงช่องทำเครื่องหมายเล็ก ๆ นี้


โอ้พระเจ้าขอบคุณมาก! คุณบันทึกการค้นหา 20 ชั่วโมงเดียวกันให้ฉัน!
Brecht Machiels

2
ไม่เห็นส่วนนั้นในส่วนความสามารถของเป้าหมาย (Xcode 9.4.1)
shim

3

ตามค่าเริ่มต้น iOS อนุญาต HTTPS API เท่านั้น เนื่องจาก HTTP ไม่ปลอดภัยคุณจะต้องปิดใช้งานความปลอดภัยในการขนส่งแอพ มีสองวิธีในการปิดใช้งาน ATS: -

1. การเพิ่มซอร์สโค้ดใน project.plist และเพิ่มโค้ดต่อไปนี้ในแท็กรูท

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

2. ใช้ข้อมูลโครงการ

คลิกที่โครงการในโครงการในบานหน้าต่างด้านซ้ายเลือกโครงการเป็นเป้าหมายและเลือกแท็บข้อมูล คุณต้องเพิ่มพจนานุกรมในโครงสร้างต่อไปนี้

ป้อนคำอธิบายรูปภาพที่นี่



1

ใช้NSExceptionDomainsอาจใช้ไม่ได้ผลพร้อมกันเนื่องจากเว็บไซต์เป้าหมายสามารถโหลดทรัพยากร (เช่นjsไฟล์) httpจากโดเมนภายนอกมากกว่า สามารถแก้ไขได้โดยการเพิ่มโดเมนภายนอกเหล่านี้NSExceptionDomainsด้วย

เมื่อต้องการตรวจสอบทรัพยากรที่ไม่สามารถโหลดได้ให้ลองใช้การดีบักแบบรีโมท นี่คือการสอน: http://geeklearning.io/apache-cordova-and-remote-debugging-on-ios/


0

สำหรับ Cordova หากคุณต้องการเพิ่มลงใน ios.json ของคุณให้ทำดังต่อไปนี้:

"NSAppTransportSecurity": [
   {
      "xml": "<dict><key>NSAllowsArbitraryLoads</key><true /></dict>"
   }
]

และควรอยู่ภายใน:

"*-Info.plist": {
   "parents": {
   }
}

เพียง <access origin = "*" /> ใน config.xml ไม่ทำงาน ไม่แน่ใจว่าทั้งคู่มีความจำเป็นหรือไม่ แต่โซลูชัน ios.json ปิดผนึกข้อตกลงสำหรับฉัน
zeusstl

ทำไมถึงNSAllowsArbitraryLoadsตั้งค่าtrue? คุณล้มล้างวัตถุประสงค์ของ ATS ยังเห็นรหัสที่อันตรายที่สุดในโลก: การตรวจสอบใบรับรอง SSL ในซอฟแวร์ที่ไม่ใช่เบราว์เซอร์ ซอฟต์แวร์ของคุณเพิ่งสร้างรายการ
jww

-1

นี่เป็นปัญหาของฟีเจอร์ที่มาพร้อมกับ iOS 9.0 พวกเขาได้เพิ่มสิ่งที่เรียกว่า App Transport Security และฉันก็รู้สึกรำคาญเมื่อมันทำลายแอพของฉัน

คุณสามารถพันผ้าพันแผลด้วยคีย์ NSAllowsArbitraryLoads เพื่อ YES ภายใต้พจนานุกรม NSAppTransportSecurity ในไฟล์. plist ของคุณ แต่ท้ายที่สุดคุณจะต้องเขียนรหัสที่เป็น URL ของคุณอีกครั้งในรูปแบบ HTTPS: //

Apple ได้เขียนคลาส NSUrlConnection ใหม่ใน iOS 9.0 คุณสามารถอ่านเกี่ยวกับมันในNSURLConnection

มิฉะนั้นคุณอาจต้องถอยออกจาก iOS 9.0 จนกว่าคุณจะมีเวลาในการใช้โซลูชันที่ถูกต้อง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.