NSPredicate - небезопасный предикат с форматом - PullRequest
0 голосов
/ 27 июня 2018

У меня есть предикат для запроса в базовой базе данных, но я не знаю, как правильно проверить его параметры?

- (void) queryToDatabaseWithStoreId:(NSInteger) storeId {
   [NSPredicate predicateWithFormat:@"store.storeId = %d", storeId];
}

Мой вопрос: как я могу проверить параметр storeId или что мне нужно использовать, чтобы эта уязвимость исчезла?

А если у меня есть список:

- (void) queryToDataBaseWithListStore:(NSArray<Store *> *) storeList {
   [NSPredicate predicateWithFormat:@"store.storeId IN %@", [storeList valueForObject:@"storeId"]];
}

https://developer.apple.com/library/archive/documentation/Security/Conceptual/SecureCodingGuide/Articles/ValidatingInput.html#//apple_ref/doc/uid/TP40007246-SW3

Мне нужно избегать этого:

Следующие широко используемые функции и методы подвергаются атакам форматной строки:

Стандарт С

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: inforrativeTextWithFormat: в NSAlert чина для предиката: предикат: предикат: аргумент: и * 1027 поднять: формат: и поднять: формат: аргументы: в NSException NSRunAlertPanel и другие функции AppKit, которые создают или возвращают панели или листы

Каков наилучший способ избежать этой атаки?

1 Ответ

0 голосов
/ 27 июня 2018

Я запрограммировал этот класс, но я не знаю, достаточно ли этого.

@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]];
...