Veracode 静态扫描报告指出了我的 Content Provider 实现中的 SQL 注入缺陷。
以前,我发布了这个问题,与我对这个缺陷的所有疑问有关。
经过几次讨论后,我得出结论,报告中可能存在误报。因为根据我研究和阅读的内容,我遵循了 Android文档和其他参考资料中提到的安全指南,以避免 SQL 注入。
到处都有建议对传递给 SQL 查询的数据执行至少一些输入验证。我想涵盖这种可能性,这是缺陷的原因。每个人都要求我在传递给查询之前清理数据。如何准确清理传递给 selectionArgs 数组的变量,这些变量传递给 Content Provider 的 delete()、update() 方法?
DatabaseUtils.sqlEscapeString()就足够了吗?请建议!
这是我需要清理变量的实现:
public Loader<Cursor> onCreateLoader(int id, Bundle b) {
switch (id) {
case THOUGHT_LOADER:
return new CursorLoader(getActivity(), NewsFeedTable.CONTENT_URI, NewsFeedTable.PROJECTION, NewsFeedTable._id + "=?", new String[]{tid}, null);
case COMMENT_LOADER:
return new CursorLoader(getActivity(), CommentTable.CONTENT_URI, CommentTable.PROJECTION, CommentTable.COLUMN_TID + "=?", new String[]{tid}, null);
default:
return null;
}
}
报告指出了该缺陷:此行中 SQL 命令中使用的特殊元素的不当中和(“SQL 注入”)(CWEID 89)
删除 = db.delete(BulletinTable.TABLE_NAME, selection, selectionArgs); 在下面的代码中:
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
if (uri.equals(Contract.BASE_CONTENT_URI)) {
deleteDatabase();
return 1;
}
SQLiteDatabase db = openHelper.getWritableDatabase();
int deleted = 0;
switch (matcher.match(uri)) {
case BULLETIN:
deleted = db.delete(BulletinTable.TABLE_NAME, selection, selectionArgs);
break;
case CLASSROOMS:
deleted = db.delete(ClassroomsTable.TABLE_NAME, selection, selectionArgs);
break;
default:
throw new IllegalArgumentException("Unsupported URI: " + uri);
}
if (deleted > 0) {
getContext().getContentResolver().notifyChange(uri, null);
}
return deleted;
}