Veracode Static Scanレポートは、コンテンツプロバイダの実装におけるSQLインジェクションの欠陥を示します。selectionArgs配列に渡されたすべての変数をサニタイズする方法はありますか?
以前、私はこの欠陥に関するすべての疑問に関連してこのquestionを投稿しました。
私はいくつかの議論の後、私はそれがレポートで偽陽性である可能性があるという結論に達しました。私が調べて読んだことによると、私はAndroidのdocsとother referenced sourcesに記載されているセキュリティガイドラインに従っていたので、SQLインジェクションを避けました。
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);以下のコードで:彼らはSQLコマンドとして解釈することはできませんので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;
}
@CLでは、レポートに問題の脆弱点があるコードスニペットを追加しました。 特定の値について不平を言うことはありませんが、この欠陥が検出されたコード内の行番号と、欠陥に関する詳細およびいくつかの推奨事項のみを示しています。 コンテンツプロバイダ実装のdelete()メソッドです。 私はイメージを削除し、代わりにコードを追加しました。 – Priya
これらの2つのコードは互いにどのように関係していますか?'delete'はどこに呼び出されますか?そして、これはあなたの以前の質問と重複していないのはなぜですか? –
はい、これらは2つの異なるコードです。彼らはお互いに何もする必要はありません。 最初のコードスニペット:_ selectionArgsで変数を渡す方法を実装していますArray._ 2番目のコードスニペット:傷が検出された_Points_ 重複としてマーク:多分この質問は重複と見なすことができます。データのサニタイズに関するもう一つの質問に答えてください。私は別の質問を作成することを考えました。 – Priya