Veracode Static Scan レポートは、コンテンツ プロバイダーの実装における SQL インジェクションの欠陥を指摘しています。
以前、この欠陥に関するすべての疑問に関連するこの質問を投稿しました。
そして、いくつかの議論の後、レポートで誤検知である可能性があるという結論に達しました. 私が調査して読んだことによると、SQL インジェクションを回避するために、Androidドキュメントやその他の参照ソースに記載されているセキュリティ ガイドラインに従っていたからです。
SQLクエリに渡されたデータに対して少なくともいくつかの入力検証を実行するようにという提案がどこにでもあります.欠陥の理由であるこの可能性をカバーしたいと思います. 誰もが、クエリに渡す前にデータをサニタイズするように求めています。コンテンツ プロバイダーの delete()、update() メソッドに渡された selectionArgs 配列に渡された変数を正確にサニタイズするにはどうすればよいですか?
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;
}