如果我在edittext
中写入包含单引号('
)的内容,我的程序会崩溃。使用这个edittext
我可以搜索我的数据库中的一些东西,其中一些包含这个单个qoute(或撇号它有什么名称,但关键是它是关于单个qoute)。我认为它有一些特殊的功能,这就是它崩溃的原因。有没有选择忽略它的功能或以某种方式解决这个问题?
例如,我的数据库中的项目:
cv.put(KEY_NAME, "Jonh's 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由用户给出(例如Jonh的想法),它很糟糕。是的,我得到语法错误。
答案 0 :(得分:2)
听起来'
导致SQL注入某种类型...... '
导致SQL语句出现语法错误。有几件事你可以考虑仔细检查:
rawQuery()
不会保护您免受SQL注入,因此请避免使用它(而是使用query
,insert
,update
和{{1而不是方法)。
首选格式化delete
和selection
,如下所示(因为它可以保护您免受SQL注入):
selectionArgs
(请注意selection = "col_1 = ?";
selectionArgs = new String[] { "value_1" };
中的值会替换String[]
字符串中的?
。
在selection
上设置inputType
,以防止用户首先输入这些字符(例如,如果您只希望用户输入数字,则设置EditText
)
总的来说,只要您正确使用android:inputType="number"
类中的Android方法,就不应该遇到SQL注入的任何问题(Android在清除它方面做得很好您)。也就是说,如果您不选择使用这些特殊用途的方法,那么您应该在运行时检查String的内容并防止SQLiteDatabase
,'
,{{ 1}}等,通过逃避它们。
您可以参考这篇文章了解更多信息:
答案 1 :(得分:1)
您需要使用selectionArgs
参数来转义字符串(以便其中的单引号不会破坏SQL)。尝试这样的事情:
return ourDatabase.query(DATABASE_TABLE, new String[] {"_id", "idea_name",}, "idea_name like ?", new String[] { "%" + qq + "%" }, null, null, null);
答案 2 :(得分:0)
好像是SQL-injection。你不得不逃避你的意见。
答案 3 :(得分:0)
还有一个jugaad。你可以用'替换'。您不必重新检查您的代码。只需修改以下内容:
String input = edittext.getText().toString();
if(input.contains("'"))
{
input = input.replace("'", "`");
}
//now proceed with the database operation ...
这将使用户能够将 RD的jugaad 等文字输入 RD`sugaad