Câu hỏi Bảo mật giao thông đã chặn một HTTP rõ ràng


Tôi cần cài đặt gì trong info.plist thế nào để kích hoạt chế độ HTTP theo thông báo lỗi sau?

Bảo mật giao thông đã chặn một tài nguyên HTTP (http: //) trong suốt   tải vì nó không an toàn. Ngoại lệ tạm thời có thể được định cấu hình qua   tệp Info.plist của ứng dụng của bạn.

Xcode

Giả sử rằng tên miền của tôi là example.com.


1283
2017-07-06 20:10


gốc


stackoverflow.com/a/31629980/1803879 - Tom Howard
Ghi chú của người kiểm duyệt: Đã có 36 câu trả lời cho câu hỏi này. Trước khi thêm khác, hãy chắc chắn rằng giải pháp của bạn là Mới. - Matt
Xem hướng dẫn này tại sao yêu cầu: iosdevcenters.blogspot.in/2016/02/… - Kirit Modi
CHÚ THÍCH: Các giải pháp ở đây đề nghị bạn nên tắt ATS (Allow arbitary loads). Chẳng bao lâu điều này sẽ không thể thực hiện được kể từ Apple sẽ yêu cầu ATS  (Ban đầu cuối năm - thời hạn đã được gia hạn) - developer.apple.com/news/?id=12212016b - Jakub Truhlář
firebase.google.com/docs/admob/ios/app-transport-security - Alex1987


Các câu trả lời:


Nếu bạn đang sử dụng Xcode 8.0 và Swift 3.0 hoặc Swift 2.2 hoặc thậm chí Objective C:

Enter image description here

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

243
2017-10-28 07:06



Nó sẽ là tốt hơn nếu điều này là (cũng) trong định dạng văn bản. - Peter Mortensen
Tại sao lại là NSAllowsArbitraryLoads đặt thành true? Bạn phá hoại mục đích của ATS. Cũng thấy Mã nguy hiểm nhất trên thế giới: xác thực chứng chỉ SSL trong phần mềm không phải trình duyệt. Phần mềm của bạn vừa tạo danh sách. - jww
@ jww Đây là mục đích của bài đăng này. Trang web tôi cần kết nối để phát âm thanh không sử dụng HTTPS và tôi không cố gắng đợi. - ThinkDigital


Sử dụng:

Enter image description here

Bạn phải đặt NSAllowsArbitraryLoads chìa khóa để VÂNG Dưới NSAppTransportSecurity từ điển trong tệp .plist của bạn.

Plist configuration


890
2017-08-04 10:42



Hãy để nó được biết đến: ĐÂY LÀ MỘT CÁCH LÀM VIỆC! Bất cứ khi nào bạn đang sử dụng HTTP qua HTTPS, bạn sẽ mở (các) thiết bị của người dùng của bạn đến các lỗ hổng. Chắc chắn nó không chắc trong nhiều trường hợp nhưng lập trình đạo đức là thực hành tốt nhất. Chỉ cần nói ... - cũng, +1 cho công việc (cho mục đích thử nghiệm) - Jacksonkr
Đây không phải là một giải pháp - đây là một HACK! Để thêm tên miền riêng lẻ "ngoại lệ", hãy xem câu trả lời dưới đây: stackoverflow.com/a/32560433/1103584 - DiscDev
Trong khi giải pháp này được biết là dễ bị tổn thương, đó là chỉ có giải pháp tôi muốn giới thiệu trong thời gian PHÁT TRIỂN. Phải gõ vào mọi miền chính xác trong quá trình phát triển chỉ là ngớ ngẩn (đặc biệt là nếu bạn đang sử dụng các dịch vụ web của bên thứ ba). - reTs
Tên của các khóa đó đã thay đổi ngay bây giờ "Cài đặt bảo mật giao thông ứng dụng" trong "Cho phép tải trọng tùy ý" - vishal dharankar
Tại sao có quá nhiều người chống lại giải pháp này? Điều này chắc chắn không phải là một hack! Nhiều ứng dụng cần liên lạc với internet thực tế nơi giao thức bảo mật không phải lúc nào cũng nằm trong tầm kiểm soát của bạn. Ví dụ: có vẻ như rất hợp lý để có thể hiển thị hình ảnh từ các máy chủ khác không có chứng chỉ SSL. - Oren


Dưới đây là các cài đặt trực quan:

visual settings for NSAllowsArbitraryLoads in info.plist via Xcode GUI


789
2017-11-14 19:08



Điều này làm việc cho tôi, trong khi chỉnh sửa plist không - Ian Bell
Tôi không có lựa chọn đó. - User
Nếu bạn mở Info.plist trực tiếp, bạn có thể thêm NSAppTransportSecurity từ điển, sau đó tạo NSAllowsArbitraryLoads mục trong đó (xem câu trả lời do Umar Farooq biên soạn, bên dưới). - Stoph
Cùng ở đây - các tên miền ngoại lệ không hoạt động với 7.3 đối với tôi. - RegularExpression
Tùy chọn này không tồn tại - XCode 7.3.1 - jameshfisher


Xem bài đăng trên diễn đàn Ứng dụng bảo mật giao thông?.

Ngoài ra trang Định cấu hình ngoại lệ bảo mật giao thông ứng dụng trong iOS 9 và OSX 10.11.

Ví dụ: bạn có thể thêm tên miền cụ thể như:

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

Tùy chọn lười biếng là:

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

Chú thích:

info.plist là một tệp XML để bạn có thể đặt mã này nhiều hơn hoặc ít hơn ở bất kỳ đâu bên trong tệp.


686
2017-07-06 20:19



không làm việc cho tôi với iOS9 beta 3. Bất kỳ giải pháp nào? - mursang
Dường như không hoạt động trong bản Beta 4. - user2443329
@lmiguelvargasf mở info.plist của bạn trong trình soạn thảo văn bản thuần tuý - Dan Beaulieu
Tôi vẫn nhận được lỗi: miền ngoại lệ được đặt và NSAllowsArbitraryLoads là sai. Ngay cả với NSAllowsArbitraryLoads thiết lập đúng lỗi sẽ xuất hiện. Có ai ở đây có vấn đề này không? - klaevv
Kể từ 1/30/2016, tài liệu của Apple cho thấy các khóa không còn có từ Tạm thời trong chúng, ví dụ: NSExceptionAllowsInsecureHTTPLoads NSExceptionMinimumTLSVersion See developer.apple.com/library/prerelease/ios/documentation/… - Philippe Monnet


Điều này đã được thử nghiệm và đang làm việc trên hạt giống iOS 9 GM - đây là cấu hình để cho phép riêng miền để sử dụng HTTP thay vì 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 cần phải false, bởi vì nó không cho phép tất cả các kết nối không an toàn, nhưng danh sách ngoại lệ cho phép kết nối một số các miền không có HTTPS.


297
2017-09-14 08:36



NÀY nên được đánh dấu là câu trả lời. Đã thử nghiệm và làm việc trên hạt giống GM 9 của iOS để cho phép một miền cụ thể sử dụng http mà không dùng cách "lười" và hoàn toàn mở ứng dụng của bạn. - DiscDev
Làm cách nào để thêm thông tin này vào info.plist của tôi? - JMStudios.jrichardson
Đây là câu trả lời đúng cho câu hỏi. Cảm ơn bạn. - dpizzuto
Ok tôi đã thêm mục nhập đó vào info.plist của mình và tôi vẫn gặp lỗi này - "Bảo mật chuyển tải ứng dụng đã chặn tải tài nguyên HTTP (http: //) rõ ràng vì nó không an toàn. Các ngoại lệ tạm thời có thể được định cấu hình thông qua Thông tin ứng dụng của bạn tệp .plist. " - KMC
@RomanShapovalov nếu bạn phải sử dụng địa chỉ IP, hãy thử thêm .xip.io vào cuối địa chỉ IP và thêm xip.io vào NSExceptionDomains của bạn. Xem xip.io. Tôi kết nối trực tiếp với IP khi phát triển (nhưng không phát hành) và điều này làm việc tuyệt vời cho tôi. - tpankake


Đây là giải pháp nhanh (nhưng không được khuyến nghị) để thêm điều này vào plist:

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

Có nghĩa là (theo Tài liệu của Apple):

NSAllowsArbitraryLoads
  Một giá trị Boolean được sử dụng để vô hiệu hóa tính năng bảo mật ứng dụng cho bất kỳ miền nào không được liệt kê trong từ điển NSExceptionDomains. Tên miền được liệt kê sử dụng cài đặt được chỉ định cho tên miền đó.

Giá trị mặc định của NO yêu cầu hành vi App Transport Security mặc định cho tất cả các kết nối.

Tôi thực sự khuyên bạn nên liên kết:

giúp tôi hiểu lý do và tất cả các tác động.

XML (trong tệp Info.plist) bên dưới sẽ:

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

không cho phép các cuộc gọi tùy ý cho tất cả các trang, nhưng đối với PAGE_FOR_WHICH_SETTINGS_YOU_WANT_TO_OVERRIDE sẽ cho phép các kết nối sử dụng giao thức HTTP.

Đối với XML ở trên, bạn có thể thêm:

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

nếu bạn muốn cho phép các kết nối không an toàn cho các tên miền phụ của địa chỉ được chỉ định.

Cách tiếp cận tốt nhất là chặn tất cả các tải trọng tùy ý (được đặt thành false) và thêm ngoại lệ để chỉ cho phép các địa chỉ mà chúng tôi biết là tốt.

Dành cho độc giả quan tâm


124
2017-09-01 12:10



NSAllowsArbitraryLoads cần phải false - Sound Blaster
@SoundBlaster cho trường hợp gì và những gì bạn thấy sai trong câu trả lời của tôi để bỏ phiếu xuống? - Julian Król
bằng cách thêm vào plist (NSAppTransportSecurity NSAllowsArbitraryLoads), tất cả các dịch vụ web hoạt động tốt ngoại trừ một dịch vụ web một dịch vụ web trả về lỗi máy chủ nội bộ (500) trong iOS 9 nhưng hoạt động tốt trong iOS8 trở lên - amit gupta
@SoundBlaster đã thay đổi, bây giờ bạn không nên phản đối :) - Julian Król
Giải thích tuyệt vời, liên kết tuyệt vời được cung cấp. Đây là một giải pháp khôn ngoan. - LargeGlasses


Đối với những người bạn muốn có thêm ngữ cảnh tại sao điều này đang xảy ra, ngoài cách khắc phục, hãy đọc bên dưới.

Với sự ra đời của iOS 9, để cải thiện tính bảo mật của các kết nối giữa một ứng dụng và dịch vụ web, kết nối an toàn giữa ứng dụng và dịch vụ web của ứng dụng phải tuân theo các phương pháp hay nhất. Hành vi thực hành tốt nhất được thực thi bởi Bảo mật truyền tải ứng dụng đến:

  • ngăn chặn việc tiết lộ tình cờ, và
  • cung cấp hành vi mặc định an toàn.

Như đã giải thích trong Kỹ thuật bảo mật giao thông ứng dụng, khi giao tiếp với dịch vụ web của bạn, App Transport Security hiện có các yêu cầu và hành vi sau:

  • Máy chủ phải hỗ trợ ít nhất giao thức Bảo mật lớp truyền tải (TLS) phiên bản 1.2.
  • Mật mã kết nối được giới hạn ở những mật khẩu cung cấp tính năng bí mật chuyển tiếp (xem danh sách các thuật toán mã hóa bên dưới.)
  • Chứng chỉ phải được ký bằng cách sử dụng thuật toán băm chữ ký SHA256 hoặc chữ ký tốt hơn, với khóa RSA 2048 bit hoặc lớn hơn hoặc 256 bit hoặc   phím Elliptic-Curve (ECC) lớn hơn.
  • Chứng chỉ không hợp lệ sẽ gây ra lỗi nghiêm trọng và không có kết nối.

Nói cách khác, yêu cầu dịch vụ web của bạn nên: a.) Sử dụng HTTPS và b.) được mã hóa bằng TLS v1.2 với tính năng bảo mật chuyển tiếp.

Tuy nhiên, như đã đề cập trong các bài đăng khác, bạn có thể ghi đè hành vi mới này từ Bảo mật truyền tải ứng dụng bằng cách chỉ định miền không an toàn trong Info.plist ứng dụng của bạn.


Để ghi đè, bạn sẽ cần phải thêm NSAppTransportSecurity > NSExceptionDomains thuộc tính từ điển cho bạn Info.plist. Tiếp theo, bạn sẽ thêm miền dịch vụ web của mình vào NSExceptionDomains từ điển.

Ví dụ: nếu tôi muốn bỏ qua hành vi Bảo mật chuyển tải ứng dụng cho dịch vụ web trên máy chủ lưu trữ www.yourwebservicehost.com sau đó tôi sẽ làm như sau:

  1. Mở ứng dụng của bạn trong Xcode.

  2. Tìm Info.plist trong Project Navigator và "right-mouse" click vào nó và chọn Mở ra như > Mã nguồn tùy chọn menu. Tệp danh sách thuộc tính sẽ xuất hiện trong ngăn bên phải.

  3. Đặt các thuộc tính sau đây chặn bên trong từ điển thuộc tính chính (dưới đầu tiên <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>

Nếu bạn cần cung cấp ngoại lệ cho các miền bổ sung thì bạn sẽ thêm một thuộc tính từ điển khác bên dưới NSExceptionDomains.

Để tìm hiểu thêm về các khóa được tham chiếu ở trên, hãy đọc kỹ thuật đã đề cập này.


113
2017-09-21 17:56



Điều này làm việc trong 2 ứng dụng của tôi, nhưng nó không hoạt động trên ứng dụng thứ ba. Có ai khác đã gặp phải tình huống sử dụng sửa lỗi ở trên và vẫn nhận được thông báo lỗi tương tự không? (và có, tôi đã cập nhật từ điển để sử dụng miền API của mình, không phải từ khóa trong mã) - helloB
Tốt ! Apple xác nhận rằng giải pháp này sử dụng - YannickSteph
Câu trả lời hay nhất, giải pháp làm việc. - Dustin Williams
Điều này làm việc cho một tập tin chỉnh sửa ứng dụng Cordova / Phonegap / Ionic ./platforms/ios/<project>/<project>-Info.plist với NSAllowsArbitraryLoads=false và nhiều miền ngoại lệ cho các dịch vụ có các kết hợp TLS / HTTP / HTTPS khác nhau. Ban đầu được sử dụng NSAllowsArbitraryLoads=true sau đó điều chỉnh, khắc phục sự cố các quy tắc thông qua thử và sai để tuân thủ các nguyên tắc và trình phê duyệt. chú thích config.xml  <access origin=.../> báo cáo một phần điền vào tệp này, nhưng hiện yêu cầu điều chỉnh bằng cách chỉnh sửa trực tiếp hoặc thông qua XCode để có được các chi tiết chính xác. - jimmont
Cũng thế <access origin="*"/> (trong tập tin config.xml) NSAllowsArbitraryLoads=true (đối với ứng dụng Cordova / Phonegap / hybrid - jimmont


Tôi không thích chỉnh sửa plist trực tiếp. Bạn có thể dễ dàng thêm nó vào plist bằng GUI:

  • Nhấp vào Info.plist trong Navigator ở bên trái.
  • Bây giờ thay đổi dữ liệu trong khu vực chính:

    • Trên dòng cuối cùng, hãy thêm dấu +
    • Nhập tên của nhóm: Cài đặt bảo mật giao thông ứng dụng
    • Nhấp chuột phải vào nhóm và chọn Add Row
    • Đi vào Cho phép tải trọng tùy ý 
    • Đặt giá trị ở bên phải VÂNG

Example


64
2017-11-06 08:06



cảm ơn bạn. bạn đã tiết kiệm thời gian của tôi. - beginners
đó là lý do tại sao tất cả chúng ta đều làm điều này! - Vincent
Để làm rõ: nếu "Cho phép tải trọng tùy ý" là CÓ, và có "Tên miền ngoại lệ", thì số lần tải được cho phép bị hạn chế đối với các tải trong Tên miền ngoại lệ. Đúng không?
là một cách an toàn để làm điều đó nếu tôi muốn phát hành ứng dụng? - Lamar
Không. Bằng cách cho phép tải tùy ý, ứng dụng của bạn có thể kết nối với bất kỳ miền nào một cách tự do. Trong quan điểm bảo mật, bạn nên kiểm soát và giới hạn miền / trang web nào ứng dụng nên kết nối, để tránh việc sử dụng mạng không mong muốn. - Raptor