面试题答案
一键面试1. 数据传输加密
使用HTTPS协议
- 技术原理:HTTPS是在HTTP的基础上通过传输层安全协议(TLS)或安全套接层协议(SSL)进行加密。它对传输的数据进行加密,防止数据在传输过程中被窃取或篡改。
- 框架:在Objective - C中,AFNetworking框架对HTTPS支持良好。AFNetworking会自动验证服务器的SSL证书,确保连接的安全性。
- 代码示例:
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 配置证书验证策略,这里采用默认的验证策略
manager.securityPolicy = [AFSecurityPolicy defaultPolicy];
NSDictionary *parameters = @{@"key": @"value"};
[manager POST:@"https://your - server - url.com/api" parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"请求成功: %@", responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"请求失败: %@", error);
}];
2. 防止注入攻击
对输入数据进行严格校验
- 技术原理:在接收JSON数据时,对每个字段进行数据类型、长度、格式等方面的校验,确保数据符合预期,防止恶意数据注入。
- 框架:可以使用JSON Schema进行JSON数据格式校验。JSON Schema定义了JSON数据的结构、类型、取值范围等。
- 代码示例:
// 假设我们从服务器获取到JSON数据
NSData *jsonData = [responseObject dataUsingEncoding:NSUTF8StringEncoding];
NSError *schemaError;
NSJSONSchema *schema = [NSJSONSchema schemaWithContentsOfURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"yourSchema" ofType:@"json"]] error:&schemaError];
NSError *validationError;
BOOL isValid = [schema validateJSONObject:responseObject error:&validationError];
if (isValid) {
NSLog(@"JSON数据格式校验通过");
} else {
NSLog(@"JSON数据格式校验失败: %@", validationError);
}
使用参数化查询(如果涉及数据库操作)
- 技术原理:在Objective - C与数据库交互时,使用参数化查询,避免将用户输入直接拼接到SQL语句中。例如,在使用FMDB框架操作SQLite数据库时,使用
?
占位符。 - 框架:FMDB是一个流行的Objective - C SQLite数据库框架。
- 代码示例:
FMDatabase *db = [FMDatabase databaseWithPath:[[NSBundle mainBundle] pathForResource:@"test" ofType:@"sqlite"]];
if ([db open]) {
NSString *query = @"INSERT INTO your_table (column1, column2) VALUES (?,?)";
BOOL success = [db executeUpdate:query withObject:@"value1" withObject:@"value2"];
if (success) {
NSLog(@"插入成功");
} else {
NSLog(@"插入失败: %@", [db lastErrorMessage]);
}
[db close];
}
3. 验证JSON数据完整性
使用数字签名
- 技术原理:服务器在发送JSON数据前,使用私钥对数据进行签名,客户端收到数据后,使用服务器的公钥对签名进行验证。如果验证通过,则说明数据在传输过程中未被篡改。
- 框架:可以使用Security框架来实现数字签名和验证。
- 代码示例: // 服务器端签名(假设已生成私钥)
// 这里只是示意,实际私钥获取和签名逻辑更复杂
SecKeyRef privateKey = getPrivateKey();
NSData *dataToSign = [jsonData copy];
CFDataRef signedData = SecKeyCreateSignature(privateKey, kSecPaddingPKCS1SHA256, (__bridge CFDataRef)dataToSign, &error);
// 客户端验证签名(假设已获取服务器公钥)
SecKeyRef publicKey = getPublicKey();
BOOL isValidSignature = SecKeyVerifySignature(publicKey, kSecPaddingPKCS1SHA256, (__bridge CFDataRef)dataToSign, signedData, &error);
if (isValidSignature) {
NSLog(@"数据完整性验证通过");
} else {
NSLog(@"数据完整性验证失败");
}