我有2个应用。第二个应用程序通过内容提供者与第一个应用程序进行交互以获得一些凭据。今天,在将我的APK上传到Playstore时,出现了错误-SQL Injection 您的应用正在使用包含SQL注入漏洞的内容提供程序。 要解决此问题,请按照此Google Help Center article中的步骤进行操作。
现在,我执行了本文中提到的所有步骤,但仍然遇到相同的错误。具体步骤是:
如果受影响的ContentProvider需要公开给其他应用:
您可以使用
防止SQL注入SQLiteDatabase.query
带有投影图的严格模式。严格模式可以防止
恶意选择条款和投影图可防止
恶意的投射条款。您必须同时使用这两项功能
确保您的查询是安全的。
您可以防止将SQL注入SQLiteDatabase.update和 SQLiteDatabase.delete通过使用使用'?'的选择子句 作为可替换参数和单独的选择数组 论点。您的选择条款不应被构造 来自不受信任的输入。
我的SQLiteQueryBuilder设置了strict = true和投影图。
private static final HashMap<String,String> values;
static {
values = new HashMap<String, String>();
values.put("_id", "_id");
values.put("name", "name");
}
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
qb.setTables(TABLE_NAME);
qb.setStrict(true);
switch (uriMatcher.match(uri)) {
case uriCode:
qb.setProjectionMap(values);
break;
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
if (sortOrder == null || sortOrder == "") {
sortOrder = name;
}
Cursor c = qb.query(db, projection, selection, selectionArgs, null,
null, sortOrder);
c.setNotificationUri(getContext().getContentResolver(), uri);
return c;
}
答案 0 :(得分:0)
这不是答案。 (我没有足够的声誉来发表评论)。看起来该错误仅与内容提供者中定义的更新和删除有关。上面的代码仅返回数据。我建议回到您的每个内容提供商并检查:
delete(Uri var1, String var2, String[] var3)
update(Uri var1, ContentValues var2, String var3, String[] var4);
在TABLE_ID情况下,应具有您所定义的选择和选择参数。在我最近的应用程序中,我定义了“ =?”例如删除,但在调用ContentResolver时使用.delete(object_Url,null,null)。如果object_Url与ID匹配,则会对其进行解析并返回选择参数,例如
selection = CONTRACT._ID + "=?";
selectionArgs = new String[] {String.valueOf(ContentUris.parseId(uri))};