- VisualStudio2022
- pprof-Hướng dẫn sử dụng nó trong bản mạng trực tiếp
- Triển khai C# các loại hộp chọn nhiều màu lựa chọn thả xuống, cây lựa chọn nhiều màu lựa chọn thả xuống và các nút tối đa
- [Ghi chú học tập] Cơ sở dữ liệu cấu trúc: cat tree
Trong quá trình phát triển iOS, việc đảm bảo an ninh mạng cho ứng dụng là một mắt xích rất quan trọng. Sau đây là một số biện pháp an ninh mạng phổ biến và mã mẫu tương ứng:
Đảm bảo rằng tất cả các yêu cầu mạng đều sử dụng giao thức HTTPS để mã hóa việc truyền dữ liệu và ngăn chặn các cuộc tấn công trung gian.
Định cấu hình Bảo mật vận chuyển ứng dụng (ATS) trong Info.plist:
NSAppTransportSecurity NSAllowsArbitraryLoads
Ghim SSL có thể đảm bảo rằng ứng dụng chỉ tin cậy chứng chỉ máy chủ được chỉ định và ngăn không cho nó bị tấn công vào máy chủ giả mạo.
nhập Lớp nền tảng URLSessionPinningDelegate: NSObject, URLSessionDelegate { func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, CompleteHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) { if let serverTrust = challenge.protectionSpace.serverTrust, SecTrustEvaluate(serverTrust, nil) == errSecSuccess, let serverCertificate = SecTrustGetCertificateAtIndex(serverTrust, 0) { let localCertificateData = try? Data(contentsOf: Bundle.main.url(forResource: "your_cert", withExtension: "cer")!) hãy để máy chủCertificateData = SecCertificateCopyData(serverCertificate) as Data if localCertificateData == serverCertificateData { let credential = URLCredential(trust: serverTrust) CompleteHandler(.useCredential, credential) return } } CompleteHandler(.cancelAuthenticationChallenge, nil) } } // Cách sử dụng let url = URL(string: "https://yoursecurewebsite.com")! let session = URLSession(configuration: .default, delegate: URLSessionPinningDelegate(), delegateQueue: nil) let task = session.dataTask(with: url) { data, reply, error in // Xử lý phản hồi } task.resume()
Sử dụng các truy vấn được tham số hóa để ngăn chặn các cuộc tấn công tiêm nhiễm SQL khi xử lý thông tin đầu vào của người dùng.
import SQLite3 func queryDatabase(userInput: String) { var db: OpaquePointer? // Mở cơ sở dữ liệu (giả sử dbPath là đường dẫn đến cơ sở dữ liệu của bạn) sqlite3_open(dbPath, &db) var queryStatement: OpaquePointer let query = "SELECT * FROM user WHERE username? = ?" if sqlite3_prepare_v2(db, query, -1, &queryStatement, nil) == SQLITE_OK { sqlite3_bind_text(queryStatement, 1, userInput, -1, nil) while sqlite3_step(queryStatement) == SQLITE_ROW { // Kết quả xử lý } } sqlite3_finalize(queryStatement) sqlite3_close(db) }
Khi lưu trữ dữ liệu nhạy cảm, hãy sử dụng thư viện mã hóa của iOS để mã hóa dữ liệu, chẳng hạn như sử dụng Chuỗi khóa.
import Security func saveToKeychain(key: String, data: Data) -> OSStatus { let query: [String: Any] = [ kSecClass as String: kSecClassGenericPassword, kSecAttrAccount as String: key, kSecValueData as String: data ] SecItemDelete(truy vấn dưới dạng CFDictionary ) // Xóa mọi mục hiện có return SecItemAdd(truy vấn dưới dạng CFDictionary, nil) // Thêm mới item } func LoadFromKeychain(key: String) -> Data? { let query: [String: Any] = [ kSecClass as String: kSecClassGenericPassword, kSecAttrAccount as String: key, kSecReturnData as String: kCFBooleanTrue!, kSecMatchLimit as String: kSecMatchLimitOne ] var dataTypeRef: AnyObject? hãy để trạng thái: OSStatus = SecItemCopyMatching(truy vấn dưới dạng CFDictionary, &dataTypeRef) if status == noErr { return dataTypeRef as?
Xác thực và vệ sinh đầu vào của người dùng để ngăn chặn XSS (tập lệnh chéo trang) và các cuộc tấn công tiêm nhiễm khác.
func clean(userInput: String) -> String { // Xóa mọi thẻ script hoặc nội dung nguy hiểm tiềm tàng khác return userInput.replacingOccurrences(of: "", with: "", options: .caseInsensitive) } // Cách sử dụng let userInput = "" let được vệ sinhInput = vệ sinh(userInput: userInput) print(sanitizedInput) // Kết quả đầu ra: cảnh báo ('xss')
Đảm bảo rằng tất cả các yêu cầu mạng đều sử dụng giao thức HTTPS để mã hóa việc truyền dữ liệu và ngăn chặn các cuộc tấn công trung gian.
Định cấu hình Bảo mật vận chuyển ứng dụng (ATS) trong Info.plist:
NSAppTransportSecurity NSAllowsArbitraryLoads
Ghim SSL có thể đảm bảo rằng ứng dụng chỉ tin cậy chứng chỉ máy chủ được chỉ định và ngăn không cho nó bị tấn công vào máy chủ giả mạo.
#import @interface URLSessionPinningDelegate : NSObject @end @implementation URLSessionPinningDelegate - (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge CompleteHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable credential))completionHandler { if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) { SecTrustRef serverTrust = challenge.protectionSpace.serverTrust; = SecTrustGetCertificateAtIndex(serverTrust, 0); NSString *certPath = [[NSBundle mainBundle] pathForResource:@"your_cert" ofType:@"cer"]; *)(SecCertificateCopyData(serverCertificate)); if ([localCertData isEqualToData:serverCertData]) { NSURLCredential *credential = [NSURLCredential credentialForTrust:serverTrust]; CompleteHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, nil); } @end // Cách sử dụng NSURL *url = [NSURL URLWithString:@"https://yoursecurewebsite.com"]; NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration]; *pinningDelegate = [[URLSessionPinningDelegate alloc] init]; NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:pinningDelegate delegateQueue:nil]; NSURLSessionDataTask *task = [session dataTaskWithURL:url CompleteHandler:^(NSData *data, NSURLResponse *response, NSError *error) { if (error == nil) { // Xử lý phản hồi } }] [tiếp tục nhiệm vụ];
Sử dụng các truy vấn được tham số hóa để ngăn chặn các cuộc tấn công tiêm nhiễm SQL khi xử lý thông tin đầu vào của người dùng.
#import - (void)queryDatabase:(NSString *)userInput { sqlite3 *db; // Mở cơ sở dữ liệu (giả sử dbPath là đường dẫn đến cơ sở dữ liệu của bạn) if (sqlite3_open([dbPath UTF8String], &db) == SQLITE_OK) { câu lệnh sqlite3_stmt *; const char *query = "CHỌN * TỪ người dùng Ở ĐÂU tên người dùng = ?"; if (sqlite3_prepare_v2(db, query, -1, &statement, NULL) == SQLITE_OK) { sqlite3_bind_text(statement, 1, [userInput UTF8String], -1, SQLITE_TRANSIENT); while (sqlite3_step( câu lệnh) == SQLITE_ROW) { // Kết quả xử lý } } sqlite3_finalize(câu lệnh); sqlite3_close(db);
Khi lưu trữ dữ liệu nhạy cảm, hãy sử dụng thư viện mã hóa của iOS để mã hóa dữ liệu, chẳng hạn như sử dụng Chuỗi khóa.
#import - (OSStatus)saveToKeychainWithKey:(NSString *)key data:(NSData *)data { NSDictionary *query = @{(__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword, (__bridge id) kSecAttrAccount: khóa, (__bridge id)kSecValueData: data}; SecItemDelete((__bridge CFDictionaryRef)query); // Xóa mọi mục hiện có return SecItemAdd((__bridge CFDictionaryRef)query, NULL); // Thêm mục mới } - (NSData *)loadFromKeychainWithKey:(NSString *)key { NSDictionary *query = @{(__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword, (__bridge id)kSecAttrAccount: key, (__bridge id)kSecReturnData: (__bridge id)kCFBooleanTrue, (__bridge id)kSecMatchLimit: (__bridge id)kSecMatchLimitOne}; trạng thái OSStatus = SecItemCopyMatching((__bridge CFDictionaryRef)query, &dataTypeRef ); if (status == noErr) { return (__bridge_transfer NSData *)dataTypeRef; } else { return nil; }
Xác thực và vệ sinh đầu vào của người dùng để ngăn chặn XSS (tập lệnh chéo trang) và các cuộc tấn công tiêm nhiễm khác.
- (NSString *)sanitize:(NSString *)userInput { // Xóa mọi thẻ tập lệnh hoặc nội dung nguy hiểm tiềm tàng khác NSString *sanitizedInput = [userInput stringByReplacingOccurrencesOfString:@"" withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(0,sanitizedInput.length)]; return cleanedInput; } // Cách sử dụng NSString *userInput = @""; NSString *sanitizedInput = [tự vệ sinh:userInput]; NSLog(@"%@", được vệ sinhInput); // Kết quả đầu ra: cảnh báo ('xss')
Thông qua các biện pháp này, bạn có thể cải thiện đáng kể tính bảo mật mạng của ứng dụng iOS của mình. Dựa trên nhu cầu của dự án, các công nghệ này được sử dụng linh hoạt để đảm bảo an toàn cho dữ liệu người dùng.
Cuối cùng, bài viết về iOS Development Fundamentals 109 - Network Security kết thúc tại đây. Nếu bạn muốn biết thêm về iOS Development Fundamentals 109 - Network Security, vui lòng tìm kiếm các bài viết về CFSDN hoặc tiếp tục duyệt các bài viết liên quan. tương lai blog của tôi! .
Làm thế nào để một thiết bị IO biết rằng giá trị trong bộ nhớ thuộc về nó đã thay đổi trong IO được ánh xạ vào bộ nhớ? ? Ví dụ: giả sử rằng địa chỉ bộ nhớ 0 được dành riêng để giữ màu nền của thiết bị VGA. Khi chúng ta thay đổi giá trị trong bộ nhớ[0], VGA
Tôi hiện đang phát triển một ứng dụng iOS sử dụng sdk Facebook để đăng nhập (thông qua FBLoginView). Mọi thứ đều hoạt động tốt ngoại trừ những người có phiên bản facebook cũ hơn. Khi họ nhấn nút "Đăng nhập bằng Facebook", anh ấy
Giả sử tôi có: đây - là một - ví dụ - với một số - dấu gạch ngangNSRange sẽ chọn phiên bản đầu tiên của "-" bằng cách sử dụng `rangeOfString:@"-", nhưng nếu tôi chỉ muốn phiên bản cuối cùng
Card.io SDK cung cấp các thông tin chi tiết sau: số thẻ, ngày hết hạn, tháng, năm, CVV và mã bưu chính. Làm cách nào tôi có thể lấy tên quốc gia từ SDK này. - (void)userDidProvideCreditCardInfo:(Ô tô
Làm cách nào để ứng dụng iOS tải xuống hình ảnh từ dịch vụ web và cài đặt chúng trên thiết bị iOS của người dùng trong quá trình cài đặt? Có thể được không? Câu trả lời hay nhất Bạn không có quyền kiểm soát việc cài đặt ứng dụng trên thiết bị của người dùng, do đó không thể tải xuống dữ liệu bổ sung trong quá trình cài đặt. Chỉ cần khởi chạy ứng dụng lần đầu tiên sau khi cài đặt
Tôi đã từng phát triển một sản phẩm iOS dành cho doanh nghiệp mà công ty chúng tôi đã bán cho các doanh nghiệp lớn để nhân viên của họ sử dụng. Ứng dụng này có sẵn thông qua AppStore và người dùng doanh nghiệp được cung cấp hồ sơ dành riêng cho công ty (chứa hồ sơ ứng dụng) để cho phép
Tôi đang cố gắng tích hợp SDK Card.io vào ứng dụng iOS của mình. Tôi muốn thực hiện một bản địa hóa đơn giản cho giao diện người dùng CardIO, chẳng hạn như thay đổi tiêu đề nút hủy hoặc văn bản nhắc "Giữ thẻ tín dụng của bạn ở đây". Tôi tìm thấy cái này trên github
Tôi đang sử dụng các lớp CardIOView và CardIOViewDelegate và không có BOOL nào có thể được đặt thành CÓ để quét collCardholderName. Tôi có thể thấy nó trong CardIOP
Tôi có một ứng dụng voip được tích hợp với bộ công cụ gọi điện. Mỗi lần tôi gọi từ ứng dụng voip của mình, một bản ghi cuộc gọi mới gần đây sẽ được tạo trong ứng dụng điện thoại gốc. Tôi cũng có danh bạ tùy chỉnh trong ứng dụng voip (điện thoại nên
Làm cách nào để ứng dụng iOS biết đã có bàn phím trên màn hình khi ứng dụng được mở? Sau khi ứng dụng đang chạy, nó có thể nhận được thông báo hiển thị/ẩn bàn phím. Tuy nhiên, nếu ứng dụng được mở dưới dạng ứng dụng phụ ở chế độ chia đôi màn hình và ứng dụng chính đã hiển thị bàn phím thì ứng dụng phụ sẽ không hiển thị
Tôi gặp lỗi sau trong trình mô phỏng: ImageIO: CGImageReadSessionGetCachedImageBlockData *** CGImageReadSessionGetCachedIm
Như được trình bày trong tài liệu của Apple, việc giao tiếp với các phụ kiện được chứng nhận (được Apple chứng nhận) có thể được thực hiện thông qua EAAccessory Framework. Nhưng tôi hơi bối rối vì một số bài đăng cho tôi biết nó cũng hoạt động qua CoreBluetoo
Mặc dù các trình gỡ lỗi ngày nay rất tốt nhưng đôi khi cách tốt nhất để tìm hiểu những gì đang diễn ra trong ứng dụng của bạn vẫn là NSLog cũ. Việc này thật dễ dàng khi bạn kết nối với máy tính; Xcode sẽ giúp bật lên bảng Log Viewer và bạn đã sẵn sàng. khi bạn không ở nơi làm việc
Trong ứng dụng iOS của tôi, tôi xác định một số điểm ưa thích. Một số trong số chúng có tên là đèn hiệu Kontakt.io, được liên kết với một PoI cụ thể (ý tôi là tên thường được gắn vào nhãn đèn hiệu). Bây giờ tôi muốn khám phá các đèn hiệu gần đó,
Tôi đang tạo plugin trigger.io để nhận lời nhắc cảnh báo. Cố gắng trả lại dữ liệu từ lời nhắc cảnh báo. Đây là mã của tôi: // Nhắc + (void)show_Prompt:(ForgeTask*)task{
Xin chào, tôi mới làm quen với Apple iOS. Mình đã đọc và tìm kiếm rất nhiều bài viết về thông báo đẩy nhưng không tìm thấy thông tin nào về các bản cập nhật mới của APNS từ io4 lên ios 6. Ai có thể cung cấp cho tôi APNS cách thực hiện trong ios không
Chiều cao của UITabBar dường như đã thay đổi giữa iOS 7 và 8/9/10/11. Tôi đăng câu hỏi này để giúp người khác dễ dàng tìm thấy câu trả lời. Sau đó: iOS 8/9/10/11 trên iPhone và iPad
Tôi nghĩ tôi có thể sử dụng các Bảng phân cảnh khác nhau cho các phiên bản iOS khác nhau. Do có sự khác biệt về UI nên mình sẽ tạo Storyboard tiếp theo: Main_iPhone.storyboard Main_iPad.st
Tôi đang viết nội dung nào đó trong đó tôi sẽ sử dụng một phần bản âm thanh từ thư viện iTunes của thiết bị để phủ lên sự kết hợp của 2 video, ví dụ: AVMutableComposition* mixComposition = [[AVMutableC
Tôi đã tạo một chương trình iOS đơn giản có khả năng biên dịch mượt mà và chạy tốt trên trình mô phỏng iPad. Chương trình tương tự không biên dịch được khi tôi yêu cầu XCode 4 sử dụng thiết bị iPad được kết nối của mình. Có vẻ như vấn đề xảy ra khi tôi cố gắng sử dụng iPad kèm theo
Tôi là một lập trình viên xuất sắc, rất xuất sắc!