首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

iOS开发基础109-网络安全

编程知识
2024年07月17日 11:10

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

Swift版

1. 使用HTTPS

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

示例代码:

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

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <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: "<script>", with: "", options: .caseInsensitive)
                    .replacingOccurrences(of: "</script>", with: "", options: .caseInsensitive)
}

// Usage
let userInput = "<script>alert('xss')</script>"
let sanitizedInput = sanitize(userInput: userInput)
print(sanitizedInput) // Outputs: alert('xss')

OC版

1. 使用HTTPS

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

示例代码:

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

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <false/>
</dict>

2. SSL Pinning

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

示例代码:

#import <Foundation/Foundation.h>

@interface URLSessionPinningDelegate : NSObject <NSURLSessionDelegate>

@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 <sqlite3.h>

- (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 <Security/Security.h>

- (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:@"<script>" withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, userInput.length)];
    sanitizedInput = [sanitizedInput stringByReplacingOccurrencesOfString:@"</script>" withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, sanitizedInput.length)];
    return sanitizedInput;
}

// Usage
NSString *userInput = @"<script>alert('xss')</script>";
NSString *sanitizedInput = [self sanitize:userInput];
NSLog(@"%@", sanitizedInput); // Outputs: alert('xss')

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

From:https://www.cnblogs.com/chglog/p/18307042
本文地址: http://www.shuzixingkong.net/article/104
0评论
提交 加载更多评论
其他文章 PixiJS源码分析系列:第二章 渲染在哪里开始?
第二章 渲染在哪里开始? 牢记,按第一章介绍的 npm start 启动本地调式环境才可进行调式 如果是 example 文件夹内的例子还需要 serve . 开启本地静态服务器 上一章介绍了 PixiJS 源码调式环境的安装,以及基本的调试方法。本章要研究一下它是如何渲染的 渲染大致步骤: 注册渲
PixiJS源码分析系列:第二章 渲染在哪里开始? PixiJS源码分析系列:第二章 渲染在哪里开始? PixiJS源码分析系列:第二章 渲染在哪里开始?
tensorflow学习率指数衰减ExponentialDecay的参数介绍与使用方法
本文介绍在tensorflow库中,用于动态调整神经网络的学习率的一种方法——指数衰减ExponentialDecay()策略的参数含义及其具体用法~
tensorflow学习率指数衰减ExponentialDecay的参数介绍与使用方法 tensorflow学习率指数衰减ExponentialDecay的参数介绍与使用方法 tensorflow学习率指数衰减ExponentialDecay的参数介绍与使用方法
Docker通信全视角:原理、实践与技术洞察
本文全面深入地探讨了Docker容器通信技术,从基础概念、网络模型、核心组件到实战应用。详细介绍了不同网络模式及其实现,提供了容器通信的技术细节和实用案例,旨在为专业从业者提供深入的技术洞见和实际操作指南。 关注【TechLeadCloud】,分享互联网架构、云服务技术的全维度知识。作者拥有10+年
openStack核心组件的工作流程
目录openStack核心组件的工作流程1. Keystone1.1 User1.2 Credentials1.3 Authentication1.4 Token1.5 Project1.6 Service1.7 Endpoint1.8 Role1.9 keystone综述2. glance2.1
利用FastAPI和OpenAI-Whisper打造高效的语音转录服务
最近好久没有写博客了,浅浅记录下如何将OpenAI-Whisper做成Web服务吧&#129315; 介绍 在这篇指导性博客中,我们将探讨如何在Python中结合使用FastAPI和OpenAI-Whisper。OpenAI-Whisper是一个前沿的语音识别模型,而FastAPI是一个高性能的现代
利用FastAPI和OpenAI-Whisper打造高效的语音转录服务 利用FastAPI和OpenAI-Whisper打造高效的语音转录服务 利用FastAPI和OpenAI-Whisper打造高效的语音转录服务
manim边学边做--Matrix
在代数问题中,矩阵是必不可少的工具,manim中提供了一套展示矩阵(Matrix)的模块,专门用于在动画中显示矩阵格式的数据。关于矩阵的类主要有4个: Matrix:通用的矩阵 IntegerMatrix:元素是整数的矩阵 DecimalMatrix:元素包含小数的矩阵 MobjectMatrix:
manim边学边做--Matrix manim边学边做--Matrix manim边学边做--Matrix
咬文嚼图式的介绍二叉树、B树/B-树
网上的很多博客都是只有文字说明,比较抽象,所以笔者决定自己画一些图来解释二叉树,二叉搜索树,B树/B-树。
咬文嚼图式的介绍二叉树、B树/B-树 咬文嚼图式的介绍二叉树、B树/B-树 咬文嚼图式的介绍二叉树、B树/B-树
MViT:性能杠杠的多尺度ViT | ICCV 2021
论文提出了多尺度视觉Transformer模型MViT,将多尺度层级特征的基本概念与Transformer模型联系起来,在逐层扩展特征复杂度同时降低特征的分辨率。在视频识别和图像分类的任务中,MViT均优于单尺度的ViT。 来源:晓飞的算法工程笔记 公众号 论文: Multiscale Vision
MViT:性能杠杠的多尺度ViT | ICCV 2021 MViT:性能杠杠的多尺度ViT | ICCV 2021 MViT:性能杠杠的多尺度ViT | ICCV 2021