1

如果我将某些内容写入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 的想法),它崩溃了。是的,我收到语法错误。

4

4 回答 4

2

听起来像是'导致某种 SQL 注入...这'导致您的 SQL 语句出现语法错误。有几件事您可能会考虑仔细检查:

  1. rawQuery()不会保护您免受 SQL 注入,因此请避免使用它(而是使用queryinsertupdatedelete方法)。

  2. 更喜欢格式化你的selectionselectionArgs如下(因为它会保护你免受 SQL 注入):

    selection = "col_1 = ?";
    selectionArgs = new String[] { "value_1" };
    

    (请注意,String[]替换字符串中的?s 中的值)。selection

  3. inputType在 your上设置一个EditText以防止用户首先输入这些字符(即,如果您只想让用户输入数字,则设置android:inputType="number")。

  4. 总体而言,只要您正确使用了SQLiteDatabase类中的 Android 方法,就不会遇到任何 SQL 注入问题(Android 可以很好地为您清理这些问题)。也就是说,如果您不选择使用这些特殊用途的方法,那么您应该在运行时检查 String 的内容,并通过转义它们来防止诸如';、等字符。"

您可以参考这篇文章了解更多信息:

带有 LIKE 语句的 SQL 中的 Android 单引号

于 2012-06-24T17:17:15.853 回答
1

您需要使用selectionArgs参数来转义字符串(以便其中的单引号不会破坏 SQL)。尝试这样的事情:

return ourDatabase.query(DATABASE_TABLE, new String[] {"_id", "idea_name",}, "idea_name like ?", new String[] { "%" + qq + "%" }, null, null, null);
于 2012-06-24T17:25:40.297 回答
0

看起来像 SQL-injection。你必须逃避你的输入。

于 2012-06-24T17:15:35.147 回答
0

再来一局。您可以将 ' 替换为 `。您不必重新检查您的代码。只需修改以下内容:

String input = edittext.getText().toString();

if(input.contains("'"))
{
   input = input.replace("'", "`");
}
//now proceed with the database operation ...

这将使用户能够将诸如RD 的 jugaad 之类的文本输入到RD 的jugaad

于 2018-03-16T11:05:19.640 回答