iOS开发基础109-网络安全
在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应用的网络安全性。根据项目需求,灵活运用这些技术以确保用户数据的安全。
iOS开发基础109-网络安全的更多相关文章
- IOS开发基础知识碎片-导航
1:IOS开发基础知识--碎片1 a:NSString与NSInteger的互换 b:Objective-c中集合里面不能存放基础类型,比如int string float等,只能把它们转化成对象才可 ...
- iOS开发——总结篇&IOS开发基础知识
IOS开发基础知识 1:Objective-C语法之动态类型(isKindOfClass, isMemberOfClass,id) 对象在运行时获取其类型的能力称为内省.内省可以有多种方法实现. 判断 ...
- IOS开发基础环境搭建
一.目的 本文的目的是windows下IOS开发基础环境搭建做了对应的介绍,大家可根据文档步骤进行mac环境部署: 二.安装虚拟机 下载虚拟机安装文件绿色版,点击如下文件安装 获取安装包: ...
- iOS开发基础-九宫格坐标(6)
继续对iOS开发基础-九宫格坐标(5)中的代码进行优化. 优化思路:把字典转模型部分的数据处理操作也拿到模型类中去实现,即将 ViewController 类实现中 apps 方法搬到 WJQAppI ...
- iOS开发基础-九宫格坐标(5)
继续在iOS开发基础-九宫格坐标(4)的基础上进行优化. 一.改进思路 1)iOS开发基础-九宫格坐标(4)中 viewDidLoad 方法中的第21.22行对控件属性的设置能否拿到视图类 WJQAp ...
- iOS开发基础-九宫格坐标(4)
对iOS开发基础-九宫格坐标(3)的代码进行进一步优化. 新建一个 UIView 的子类,并命名为 WJQAppView ,将 appxib.xib 中的 UIView 对象与新建的视图类进行关联. ...
- iOS开发基础-九宫格坐标(3)之Xib
延续iOS开发基础-九宫格坐标(2)的内容,对其进行部分修改. 本部分采用 Xib 文件来创建用于显示图片的 UIView 对象. 一.简单介绍 Xib 和 storyboard 的比较: 1) X ...
- iOS开发基础-九宫格坐标(2)之模型
在iOS开发基础-九宫格(1)中,属性变量 apps 是从plist文件中加载数据的,在 viewDidLoad 方法中的第20行.26行中,直接通过字典的键名来获取相应的信息,使得 ViewCont ...
- iOS开发基础-图片切换(4)之懒加载
延续:iOS开发基础-图片切换(3),对(3)里面的代码用懒加载进行改善. 一.懒加载基本内容 懒加载(延迟加载):即在需要的时候才加载,修改属性的 getter 方法. 注意:懒加载时一定要先判断该 ...
- iOS开发基础-图片切换(3)之属性列表
延续:iOS开发基础-图片切换(2),对(2)里面的代码用属性列表plist进行改善. 新建 Property List 命名为 Data 获得一个后缀为 .plist 的文件. 按如图修改刚创建的文 ...
随机推荐
- T2T-ViT:更多的局部结构信息,更高效的主干网络 | ICCV 2021
论文提出了T2T-ViT模型,引入tokens-to-token(T2T)模块有效地融合图像的结构信息,同时借鉴CNN结果设计了deep-narrow的ViT主干网络,增强特征的丰富性.在ImageN ...
- 我开源的H5商城2.0版本发布,强烈推荐
简介 waynboot-mall 是一套全部开源的 H5 商城项目,包含运营后台.H5 商城前台和后端接口三个项目 .实现了一套完整的商城业务,有首页展示.商品分类.商品详情.sku 详情.商品搜索. ...
- 更改wsl中系统的安装位置
wsl默认安装位置是C盘,众所周知C盘总是不够用的,所以才有了把wsl的系统迁移到其它位置的需求.官网文档 首先查看所有分发版本 wsl -l --all -v 导出分发版为tar文件到D盘 wsl ...
- HTML——input之复选框
在 HTML 中,把 <input> 标签中的 type 属性设置为 checkbox 可以实现多选框的效果.具体语法格式如下: <input type="checkbox ...
- 008. gitlab代码克隆与推送
推送配置 gitlab需要推送的客户端sshkey添加到gitlab服务器中 node1 推送配置 centos node1: [root@node1 ~]# cat ~/.ssh/id_rsa.pu ...
- 继承,super,重写,多态,抽象,接口
继承,super,重写,多态,抽象,接口 继承 extends 用于表示两个类之间的继承关系,继承是OOP的四大特性之一,他允许一个类(称之为子类或派送类) 继承另一个类(称之为父类或基类)的变量和方 ...
- 【论文笔记】YOLO系列
[深度学习]总目录 YOLOv1:<You Only Look Once: Unified, Real-Time Object Detection>one-stage的开山之作,将目标检测 ...
- Nodejs中间件 中间件分类和自定义中间件
中间件 中间件理解 中间件可以理解为业务流程的中间处理环节.如生活中吃一般炒青菜,大约分为如下几步骤 express中当一个请求到达的服务器之后,可以在给客户响应之前连续调用多个中间件,来对本次请求和 ...
- C#.NET根据不同业务类别类型写入不同文件中,动态创建log4net实例验证
C#.NET根据不同业务类别类型写入不同文件中,动态创建log4net实例验证 参考了:https://www.cnblogs.com/-dawn/p/8598566.html GetLog4netI ...
- 使用 nsenter 排查容器网络问题
需求 我想进入容器中执行 curl 命令探测某个地址的连通性,但是容器镜像里默认没有 curl 命令.我这里是一个内网环境不太方便使用 yum 或者 apt 安装,怎么办? 这个需求比较典型,这里教大 ...