我在核心数据库中有一个查询谓词,但是我不知道验证其参数的正确方法是什么?
- (void) queryToDatabaseWithStoreId:(NSInteger) storeId {
[NSPredicate predicateWithFormat:@"store.storeId = %d", storeId];
}
我的问题是我该如何验证storeId参数或该消失的隐患我需要使用什么?
如果我有清单:
- (void) queryToDataBaseWithListStore:(NSArray<Store *> *) storeList {
[NSPredicate predicateWithFormat:@"store.storeId IN %@", [storeList valueForObject:@"storeId"]];
}
我需要避免这种情况:
以下常用的函数和方法易受格式字符串攻击:
标准C
printf和printf(3)手册页上列出的其他功能 sscanf和scanf(3)手册页上列出的其他功能 syslog和vsyslog
碳
AEBuildDesc和vAEBuildDesc AEBuildParameters和vAEBuildParameters AEBuildAppleEvent和vAEBuildAppleEvent 核心基础 CFStringCreateWithFormat CFStringCreateWithFormatAndArguments CFStringAppendFormat CFStringAppendFormatAndArguments
可可粉
stringWithFormat:,initWithFormat:和其他使用格式化字符串作为参数的NSString方法 appendFormat:NSMutableString类中 alertWithMessageText:defaultButton:alternateButton:otherButton:informativeTextWithFormat:在NSAlert中 predicateWithFormat :、 predicateWithFormat:arguments:和 predicateWithFormat:argumentArray:在NSPredicate中 在NSException中引发:格式:和引发:格式:参数: NSRunAlertPanel和其他创建或返回面板或图纸的AppKit函数
避免这种攻击的最佳方法是什么?
答案 0 :(得分:0)
我已经为这门课编程,但是我不知道这是否足够。
@implementation StringUtils
+ (BOOL) isEmpty:(id) text {
if ([text isKindOfClass:[NSNull class]]) {
return YES;
} else {
if (text) {
if ([text isKindOfClass:[NSString class]]) {
NSString *textStr = [NSString stringWithFormat:@"%@", text];
return [textStr isEqualToString:@""];
}
return YES;
} else {
return YES;
}
}
}
+ (NSString *) validateField:(id) text {
NSInteger numErrors = 0;
NSString *pattern = @"[^A-Za-z0-9-]+";
NSError *error = nil;
NSString *textValidated = @"";
if ([text isKindOfClass:[NSNumber class]]) {
textValidated = [text stringValue];
} else if ([text isKindOfClass:[NSString class]]) {
textValidated = text;
} else {
@try {
textValidated = [text stringValue];
} @catch (NSException *exception) {
numErrors=+1;
}
}
//Only numbers && chars && -
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:&error];
NSRange textRange = NSMakeRange(0, textValidated.length);
NSRange matchRange = [regex rangeOfFirstMatchInString:textValidated options:NSMatchingReportProgress range:textRange];
if (matchRange.location != NSNotFound) {
numErrors+=1;
}
//Not empty string
if ([StringUtils isEmpty:textValidated]) {
numErrors+=1;
}
if (numErrors == 0) {
return textValidated;
}
return @"";
}
+ (NSArray *) validateArrayFields:(NSArray *) list {
NSInteger *numErrors = 0;
for (id obj in list) {
if ([StringUtils isEmpty:[StringUtils validateField:obj]]) {
numErrors+=1;
}
}
if (numErrors == 0) {
return list;
}
return [[NSArray alloc] init];
}
@end
正常使用:
[NSPredicate predicateWithFormat:@"store.storeId = %@", [StringUtils validateField:storeId]];
用于数组:
[NSPredicate predicateWithFormat:@"store.storeId IN %@", [StringUtils validateArrayFields:storeId]];