!!!!!!!!Listing 1 ///Überschrift:SQL mit Prepared Statements const char *sql = "SELECT username FROM users where uid = ?"; sqlite3_prepare_v2(db, sql, -1, &selectUid, NULL); sqlite3_bind_int(selectUid, 1, uid); int status = sqlite3_step(selectUid); !!!!Listing 2/// Überschrift: Verschlüsselung aller Daten im App-Verzeichnis Documents - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { NSError *error = nil; NSDictionary *fileAttributes = [NSDictionary dictionaryWithObject:NSFileProtectionComplete forKey:NSFileProtectionKey]; if(![[NSFileManager defaultManager] setAttributes:fileAttributes ofItemAtPath:[[self applicationDocumentsDirectory] path] error: &error]) { NSLog(@"Unresolved error with store encryption %@, %@", error, [error userInfo]); abort(); } return YES; } - (NSURL *)applicationDocumentsDirectory { return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; } !!!!Listing 3 //// Überschrift: Ablage von Zugangsdaten in der Keychain - (BOOL) saveAccountData: (NSData *)password forAccount:(NSString *)account { NSMutableDictionary *attrs = [self queryForAccount: account]; [attrs setObject: password forKey: kSecValueData]; [attrs setObject: kSecAttrAccessibleWhenUnlockedThisDeviceOnly forKey: kSecAttrAccessible]; OSStatus status = SecItemAdd(attrs, NULL); return status == noErr; } !!!Listing 4 /// Überschrift: Eingabefilterung bei der Interprozesskommunikation - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { // Filterung der aufrufenden Applikation anhand der Bundle-ID // Eingabevalidierung der übergegebenen Parameter / Daten } !!!Listing 5///Überschrift: Informationspreisgabe in Screenshots verhindern - (void) applicationWillResignActive:(UIApplication *)application { _window.hidden = YES; } ... - (void)applicationDidBecomeActive:(UIApplication *)application { _window.hidden = NO; } Listing 6////Überschrift: Löschen der Zwischenablage - (void) applicationWillResignActive:(UIApplication *)application { UIPasteboard *pasteBoard = [UIPasteboard generalPasteboard]; pasteBoard.items = nil; } Listing 7///Überschrieft: Beispielimplementierung einer Jailbreak-Erkennung - (BOOL) JailbreakCheck{ NSError *error = nil; // Vorhandensein von Applikationen aus dem Jailbreak Umfeld NSArray *checkPath = [NSArray arrayWithObjects: @"/Applications/Cydia.app", @"/usr/sbin/sshd", @"/usr/bin/sshd", @"/private/var/lib/apt", @"/Applications/blackra1n.app", // Additional Checks nil]; for(NSString *string in checkPath) if ([[NSFileManager defaultManager] fileExistsAtPath:string]) { // Indiz für Jailbreak } else{ // kein Indiz für Jailbreak } // Systempartition mit Schreibrechten eingebunden [fmngr release]; NSString *fstab = [NSString stringWithContentsOfFile:@"/etc/fstab" encoding:NSISOLatin1StringEncoding error:&error]; NSRange tmpString; NSString *substring = [NSString stringWithString:@" / hfs rw"]; tmpString =[[fstab lowercaseString] rangeOfString:[substring lowercaseString]]; if(tmpString.location != NSNotFound) { // Indiz für Jailbreak } else { // kein Indiz für Jailbreak } // Anlegen von Dateien außerhalb der eigenen Sandbox // Achtung: Der nachfolgende Code kann zur Ablehnung der Applikation im // AppStore Review-Prozess führen. NSFileManager *fmngr = [[NSFileManager alloc] init]; NSString *filePath = [[NSBundle mainBundle] pathForResource:@"jailbreakcheck.txt" ofType:nil]; if([fmngr copyItemAtPath:filePath toPath:[NSString stringWithString:@"/Applications/jailbreakcheck.txt"] error:&error]) { // Indiz für Jailbreak } else { // kein Indiz für Jailbreak } } Listing 8: /// Überschrift: Selbstzerstörung einer Applikation - (void) deleteData:(NSString *)theFilePath{ if ([fileMgr removeItemAtPath:theFilePath error:&error] != YES) NSLog(@"Fehler: %@", [error localizedDescription]); }