我有2个应用程序.第二个应用程序通过内容提供商与第一个应用程序交互以获取一些凭据.今天在Playstore上传我的apk时出现错误-SQL注入您的应用程序正在使用包含SQL注入漏洞的内容提供程序.要解决此问题,请按照此Google帮助中心文章中的步骤操作.
现在我执行了文章中提到的所有步骤,但仍然得到相同的错误.具体步骤如下:
如果受影响的ContentProvider需要向其他应用程序公开:
您可以通过使用
带投影映射的严格模式来阻止SQL注入SQLiteDatabase.query .严格模式可防止
恶意选择条款和投影图防止
恶意投影条款.您必须使用这两个功能才能确保查询安全.
您可以通过使用使用'?'的选择子句来阻止SQL注入SQLiteDatabase.update和SQLiteDatabase.delete 作为可替换参数和单独的选择参数数组.您的选择条款不应由不受信任的输入构成.
我的SQLiteQueryBuilder有set 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;
}
Run Code Online (Sandbox Code Playgroud)
这不是一个答案。(我没有足够的声誉来发表评论)。看起来该错误仅与内容提供程序中定义的更新和删除有关。上面的代码只是返回数据。我建议返回到每个内容提供商并检查:
delete(Uri var1, String var2, String[] var3)
update(Uri var1, ContentValues var2, String var3, String[] var4);
Run Code Online (Sandbox Code Playgroud)
TABLE_ID 案例应该具有如您所提到的定义的选择和选择参数。在我最近的应用程序中,我定义了“=?” 例如delete,但在调用ContentResolver时使用了.delete(object_Url, null, null)。如果 object_Url 与 id 匹配,则会对其进行解析并返回选择参数,例如
selection = CONTRACT._ID + "=?";
selectionArgs = new String[] {String.valueOf(ContentUris.parseId(uri))};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
726 次 |
| 最近记录: |