Если я напишу что-нибудь в edittext
, содержащем одинарную кавычку ('
), моя программа edittext
строя. С помощью этого edittext
я могу искать вещи в своей базе данных, и некоторые из них содержат этот единственный qoute (или апостроф независимо от его имени, но дело в том, что это о единственном qoute). Я предполагаю, что у него есть специальные функции, и поэтому он падает. Есть ли возможность игнорировать его функцию или решить эту проблему?
например, элемент в моей базе данных:
cv.put(KEY_NAME, "Jonh idea");
cv.put(KEY_HOTNESS, "amazing");
cv.put(KEY_MONEY, "500");
ourDatabase.insert(DATABASE_TABLE, null, cv);
Затем, когда я ищу его с помощью этого метода:
return ourDatabase.query(DATABASE_TABLE, new String[] {"_id", "idea_name",},
"idea_name like " + "'%" + qq + "%'", null, null, null, null);
где qq задается пользователем (например, идея Джона), он сует. И да, я получаю синтаксическую ошибку.
Вам нужно использовать аргумент selectionArgs
чтобы избежать строки (так что одинарная кавычка в ней не нарушает SQL). Попробуйте что-то вроде этого:
return ourDatabase.query(DATABASE_TABLE, new String[] {"_id", "idea_name",}, "idea_name like ?", new String[] { "%" + qq + "%" }, null, null, null);
?
, не %
. Проверьте мой обновленный пост.
Похоже, что '
вызывает SQL-инъекцию какого-то типа... '
вызывает синтаксическую ошибку в вашем SQL-заявлении. Есть несколько вещей, которые вы можете рассмотреть с помощью двойной проверки:
rawQuery()
не защитит вас от SQL-инъекций, поэтому не используйте его (вместо этого используйте методы query
, insert
, update
и delete
).
Предпочитаете форматировать свой selection
и selectionArgs
следующим образом (так как он защитит вас от SQL-инъекций):
selection = "col_1 = ?";
selectionArgs = new String[] { "value_1" };
(обратите внимание, что значения в String[]
заменяют ?
в строке selection
).
Задайте inputType
на вашем EditText
чтобы пользователи не inputType
эти символы в первую очередь (т. android:inputType="number"
Если вы хотите, чтобы пользователи вводили числа, а затем установите android:inputType="number"
).
В целом, если вы правильно используете методы Android в классе SQLiteDatabase
, вы не должны столкнуться с какими-либо проблемами с SQL-инъекциями (Android отлично справляется с этим, чтобы очистить это для вас). Тем не менее, если вы не захотите использовать эти специальные методы, вы должны проверить содержимое String во время выполнения и защитить от таких символов, как '
, ;
, "
и т.д., избегая их.
Вы можете обратиться к этому сообщению за дополнительной информацией:
Еще один югаад. Вы можете заменить 'на'. Вам не придется проверять свой код. Просто измените следующее:
String input = edittext.getText().toString();
if(input.contains("'"))
{
input = input.replace("'", "'");
}
//now proceed with the database operation ...
Это позволит пользователю вводить текст, например RD jugaad, в RD jugaad
Это похоже на SQL-инъекцию. U должен избегать ввода.
'
в файле XML или в коде? Можете ли вы показать часть XML или кода, который добавляет этот символ в поле? Кроме того, что вы пытались решить проблему?return ourDatabase.query(DATABASE_TABLE, new String[] {"_id", "idea_name"}, "idea_name like '%?%'", new String[] { qq }, null, null, null);