码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • iOS开发基础109-网络安全


    合集 - iOS进阶(73)
    1.iOS开发基础77-一像素线的几种实现方式2016-03-262.iOS开发基础78-iOS 国际化2016-03-263.iOS开发基础82-关于iOS目录2017-04-194.iOS开发基础81-Runtime实战2017-04-175.iOS开发基础80-关于Xcode82016-11-156.iOS开发基础79-强制退出程序2016-10-207.iOS开发基础90-密码学2018-08-038.iOS开发基础89-Runloop2018-08-029.iOS开发基础88-涂鸦效果2018-06-0410.iOS开发基础87-抽屉效果2018-06-0411.iOS开发基础86-FMDB2018-05-3012.iOS开发基础85-线程dispatch apply2017-07-1213.iOS开发基础84-HTTP请求方法详解与增删改查的应用2017-05-1214.iOS开发基础83-线程组2017-04-2815.iOS开发基础106-Instruments07-1616.iOS开发基础105-Xcode收集Crashs的各种方法07-1617.iOS开发基础104-正向代理和反向代理07-1618.iOS开发基础103-APP之间跳转07-1619.iOS开发基础102-后台保活方案07-1620.iOS开发基础101-指纹和面部识别07-1621.iOS开发基础100-MDM证书申请流程2022-03-2822.iOS开发基础99-iOS 内购的防范与优化2021-09-2823.iOS开发基础98-跳转淘宝案例2019-06-2024.iOS开发基础97-应用内购(In-App Purchase)的安全性解析与收据处理流程2019-06-0625.iOS开发基础96-UI类继承关系图2019-03-1926.iOS开发基础95-程序内评价2019-01-0727.iOS开发基础94-xcode102018-09-2528.iOS开发基础93-GCD死锁2018-09-0429.iOS开发基础92-线程保活2018-09-0430.iOS开发基础91-线程同步技术与资源共享详解2018-09-0431.iOS开发基础138-视频编码07-2332.iOS开发基础137-音视频编解码简介07-2333.iOS开发基础136-防暴力点击07-2334.iOS开发基础135-Core Data07-2235.iOS开发基础134-异步并行上传问题07-1836.iOS开发基础133-崩溃预防07-1837.iOS开发基础132-POSIX线程库07-1838.iOS开发基础131-isa指针07-1839.iOS开发基础130-视频录制上传07-1840.iOS开发基础129-音频录制上传07-1841.iOS开发基础128-应用本地化07-1842.iOS开发基础127-深入探讨KVO07-1743.iOS开发基础126-深入探索设计模式07-1744.iOS开发基础125-深入探索SDWebImage07-1745.iOS开发基础124-RunLoop实现卡顿检测07-1746.iOS开发基础123-自动释放池原理07-1747.iOS开发基础122-RunLoop07-1748.iOS开发基础121-APP启动优化07-1749.iOS开发基础120-通知与线程07-1750.iOS开发基础119-组件化07-1751.iOS开发基础118-Runtime07-1752.iOS开发基础117-Hybrid07-1753.iOS开发基础116-性能监控07-1754.iOS开发基础115-Socket07-1755.iOS开发基础114-YYCache07-1756.iOS开发基础113-Unity3D07-1757.iOS开发基础112-GCD常见场景07-1758.iOS开发基础111-RAC07-1759.iOS开发基础110-Core Graphics应用场景07-17
    60.iOS开发基础109-网络安全07-17
    61.iOS开发基础108-常见的编程范式07-1662.iOS开发基础107-iOS直播07-1663.iOS开发基础148-ABM vs MDM08-0564.iOS开发基础147-ABM集中管理Apple设备08-0565.iOS开发基础146-深入解析WKWebView08-0366.iOS开发基础145-Apple Search Ads08-0167.iOS开发基础144-逐字打印效果08-0168.iOS开发基础143-性能优化07-2669.iOS开发基础142-广告归因07-2570.iOS开发基础141-音频解码07-2371.iOS开发基础140-音频编码07-2372.iOS开发基础139-视频解码07-2373.iOS开发基础149-由UUIDString引发的思考08-09
    收起

    在iOS开发中,保障应用的网络安全是一个非常重要的环节。以下是一些常见的网络安全措施及对应的示例代码:

    Swift版

    1. 使用HTTPS

    确保所有的网络请求使用HTTPS协议,以加密数据传输,防止中间人攻击。

    示例代码:

    在Info.plist中配置App Transport Security (ATS):

    <key>NSAppTransportSecuritykey>
    <dict>
        <key>NSAllowsArbitraryLoadskey>
        <false/>
    dict>
    

    2. SSL Pinning

    通过SSL Pinning可以确保应用程序只信任指定的服务器证书,防止被劫持到伪造的服务器。

    示例代码:

    import Foundation
    
    class URLSessionPinningDelegate: NSObject, URLSessionDelegate {
      func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @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")!)
                let serverCertificateData = SecCertificateCopyData(serverCertificate) as Data
    
                if localCertificateData == serverCertificateData {
                    let credential = URLCredential(trust: serverTrust)
                    completionHandler(.useCredential, credential)
                    return
                }
            }
            completionHandler(.cancelAuthenticationChallenge, nil)
      }
    }
    
    // Usage
    let url = URL(string: "https://yoursecurewebsite.com")!
    let session = URLSession(configuration: .default, delegate: URLSessionPinningDelegate(), delegateQueue: nil)
    let task = session.dataTask(with: url) { data, response, error in
        // Handle response
    }
    task.resume()
    

    3. 防止SQL注入

    在处理用户输入时,使用参数化查询来防止SQL注入攻击。

    示例代码:

    import SQLite3
    
    func queryDatabase(userInput: String) {
        var db: OpaquePointer?
        // Open database (assuming dbPath is the path to your database)
        sqlite3_open(dbPath, &db)
    
        var queryStatement: OpaquePointer?
        let query = "SELECT * FROM users 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 {
                // Process results
            }
        }
        
        sqlite3_finalize(queryStatement)
        sqlite3_close(db)
    }
    

    4. Data Encryption

    在存储敏感数据时,使用iOS的加密库来加密数据,比如使用Keychain。

    示例代码:

    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(query as CFDictionary) // Delete any existing item
        return SecItemAdd(query as CFDictionary, nil) // Add new 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?
        let status: OSStatus = SecItemCopyMatching(query as CFDictionary, &dataTypeRef)
    
        if status == noErr {
            return dataTypeRef as? Data
        } else {
            return nil
        }
    }
    

    5. 输入验证与清理

    对用户输入进行验证和清理,防止XSS(跨站脚本攻击)和其他注入攻击。

    示例代码:

    func sanitize(userInput: String) -> String {
        // Remove any script tags or other potentially dangerous content
        return userInput.replacingOccurrences(of: "", with: "", options: .caseInsensitive)
    }
    
    // Usage
    let userInput = ""
    let sanitizedInput = sanitize(userInput: userInput)
    print(sanitizedInput) // Outputs: alert('xss')
    

    OC版

    1. 使用HTTPS

    确保所有的网络请求都使用HTTPS协议,以加密数据传输,防止中间人攻击。

    示例代码:

    在Info.plist中配置App Transport Security (ATS):

    <key>NSAppTransportSecuritykey>
    <dict>
        <key>NSAllowsArbitraryLoadskey>
        <false/>
    dict>
    

    2. SSL Pinning

    通过SSL Pinning可以确保应用程序只信任指定的服务器证书,防止被劫持到伪造的服务器。

    示例代码:

    #import 
    
    @interface URLSessionPinningDelegate : NSObject 
    
    @end
    
    @implementation URLSessionPinningDelegate
    
    - (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * _Nullable credential))completionHandler {
        if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {
            SecTrustRef serverTrust = challenge.protectionSpace.serverTrust;
            SecCertificateRef serverCertificate = SecTrustGetCertificateAtIndex(serverTrust, 0);
            
            NSString *certPath = [[NSBundle mainBundle] pathForResource:@"your_cert" ofType:@"cer"];
            NSData *localCertData = [NSData dataWithContentsOfFile:certPath];
            NSData *serverCertData = (__bridge NSData *)(SecCertificateCopyData(serverCertificate));
            
            if ([localCertData isEqualToData:serverCertData]) {
                NSURLCredential *credential = [NSURLCredential credentialForTrust:serverTrust];
                completionHandler(NSURLSessionAuthChallengeUseCredential, credential);
                return;
            }
        }
        completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, nil);
    }
    
    @end
    
    // Usage
    NSURL *url = [NSURL URLWithString:@"https://yoursecurewebsite.com"];
    NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
    URLSessionPinningDelegate *pinningDelegate = [[URLSessionPinningDelegate alloc] init];
    NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:pinningDelegate delegateQueue:nil];
    
    NSURLSessionDataTask *task = [session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        if (error == nil) {
            // Handle response
        }
    }];
    [task resume];
    

    3. 防止SQL注入

    在处理用户输入时,使用参数化查询来防止SQL注入攻击。

    示例代码:

    #import 
    
    - (void)queryDatabase:(NSString *)userInput {
        sqlite3 *db;
        // Open database (assuming dbPath is the path to your database)
        if (sqlite3_open([dbPath UTF8String], &db) == SQLITE_OK) {
            sqlite3_stmt *statement;
            const char *query = "SELECT * FROM users WHERE username = ?";
            
            if (sqlite3_prepare_v2(db, query, -1, &statement, NULL) == SQLITE_OK) {
                sqlite3_bind_text(statement, 1, [userInput UTF8String], -1, SQLITE_TRANSIENT);
                
                while (sqlite3_step(statement) == SQLITE_ROW) {
                    // Process results
                }
            }
            
            sqlite3_finalize(statement);
            sqlite3_close(db);
        }
    }
    

    4. Data Encryption

    在存储敏感数据时,使用iOS的加密库来加密数据,比如使用Keychain。

    示例代码:

    #import 
    
    - (OSStatus)saveToKeychainWithKey:(NSString *)key data:(NSData *)data {
        NSDictionary *query = @{(__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword,
                                (__bridge id)kSecAttrAccount: key,
                                (__bridge id)kSecValueData: data};
        
        SecItemDelete((__bridge CFDictionaryRef)query); // Delete any existing item
        return SecItemAdd((__bridge CFDictionaryRef)query, NULL); // Add new item
    }
    
    - (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};
        
        CFTypeRef dataTypeRef = NULL;
        OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)query, &dataTypeRef);
        
        if (status == noErr) {
            return (__bridge_transfer NSData *)dataTypeRef;
        } else {
            return nil;
        }
    }
    

    5. 输入验证与清理

    对用户输入进行验证和清理,防止XSS(跨站脚本攻击)和其他注入攻击。

    示例代码:

    - (NSString *)sanitize:(NSString *)userInput {
        // Remove any script tags or other potentially dangerous content
        NSString *sanitizedInput = [userInput stringByReplacingOccurrencesOfString:@"" withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, sanitizedInput.length)];
        return sanitizedInput;
    }
    
    // Usage
    NSString *userInput = @"";
    NSString *sanitizedInput = [self sanitize:userInput];
    NSLog(@"%@", sanitizedInput); // Outputs: alert('xss')
    

    通过这些措施,你可以显著提升iOS应用的网络安全性。根据项目需求,灵活运用这些技术以确保用户数据的安全。

    将来的你会感谢今天如此努力的你! 版权声明:本文为博主原创文章,未经博主允许不得转载。
  • 相关阅读:
    Web会话跟踪:Cookie与Session
    线性代数-3
    Linus:我终于在 M2 芯片的 MacBook 上发布了 Linux 最新版本!
    路飞day2
    SpringCloud(二)Docker、Spring AMQP、ElasticSearch
    算法---树状数组
    Python 无废话-基础知识函数详解
    Linux 后台运行 springboot项目
    2022-09-18 mysql-subselect相关执行流程记录
    刷题学习记录
  • 原文地址:https://www.cnblogs.com/chglog/p/18307042
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号