2017-02-17 6 views
0

Я рассматривал некоторые подобные вопросы здесь, но не могу найти никаких рабочих решений.Невозможно отправить вход пользователя, содержащий апостроф, в базу данных sqlite3 (Obj-C)

Мое приложение позволяет пользователю писать все, что им нужно, в UITextField и отправлять его в базу данных sqlite3. Однако, если он содержит апостроф, он не отправит его.

Я знаю, что создание двух апострофов в текстовом поле работает, но это не является удобным для пользователя ... Любые идеи?

Спасибо!

- (IBAction)saveInfo:(id)sender { 
    // Prepare the query string. 
    // If the recordIDToEdit property has value other than -1, then create an update query. Otherwise create an insert query. 
    NSString *query; 
    if (self.recordIDToEdit == -1) { 
     query = [NSString stringWithFormat:@"insert into peopleInfo values(null, '%@', %@)", self.txtFirstname.text, self.txtDate.text]; 
    } 
    else{ 
     query = [NSString stringWithFormat:@"update peopleInfo set firstname='%@', date=%@ where peopleInfoID=%d", self.txtFirstname.text, self.txtDate.text, self.recordIDToEdit]; 
    } 
+0

Это выглядит опасно для меня. Вы делаете клиент SQLite в iOS? – Raptor

+0

Это просто для практики, но почему это опасно? – Cuckoo

+0

Из-за маленьких таблиц Бобби см. Мой ответ ниже. –

ответ

1

Никогда не делайте этого так! Всегда помните маленькие таблицы Бобби: Exploits of a Mom

Использовать prepared statements для вставки данных в базу данных, никогда не связывать/создавать свои заявления самостоятельно; посмотрите здесь:

Objective-C: Fast SQLite Inserts with Prepared Statements for Escaped Apostrophes and SQL Injection Protection


На свой страх и риск, вы могли бы использовать stringByReplacingOccurrencesOfString:withString:, чтобы избежать каждой одинарной кавычки с двумя одинарными кавычками:

NSString *firstName = self.txtFirstname.text; 
firstName = [firstName stringByReplacingOccurrencesOfString:@"'" withString:@"''"]; 

if (self.recordIDToEdit == -1) { 
    query = [NSString stringWithFormat:@"insert into peopleInfo values(null, '%@', %@)", firstName, self.txtDate.text]; 
} 
else{ 
    query = [NSString stringWithFormat:@"update peopleInfo set firstname='%@', date=%@ where peopleInfoID=%d", firstName, self.txtDate.text, self.recordIDToEdit]; 
} 
+0

См. Ответ выше, используйте 'stringByReplacingOccurrencesOfString: withString:' –

0

Вы всегда должны сделать некоторые тип «стирания строки» при конкатенации запроса. Что касается безопасности, найдите атаки SQL-инъекций.

+0

Я вижу, спасибо за информацию! – Cuckoo

+0

Добро пожаловать. Продвиньте мой ответ, если это будет полезно. Благодаря :) –