0

Veracode Static Sc​​anレポートは、コンテンツプロバイダの実装におけるSQLインジェクションの欠陥を示します。selectionArgs配列に渡されたすべての変数をサニタイズする方法はありますか?

以前、私はこの欠陥に関するすべての疑問に関連してこのquestionを投稿しました。

私はいくつかの議論の後、私はそれがレポートで偽陽性である可能性があるという結論に達しました。私が調べて読んだことによると、私はAndroidのdocsother 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; 
} 
+0

@CLでは、レポートに問題の脆弱点があるコードスニペットを追加しました。 特定の値について不平を言うことはありませんが、この欠陥が検出されたコード内の行番号と、欠陥に関する詳細およびいくつかの推奨事項のみを示しています。 コンテンツプロバイダ実装のdelete()メソッドです。 私はイメージを削除し、代わりにコードを追加しました。 – Priya

+0

これらの2つのコードは互いにどのように関係していますか?'delete'はどこに呼び出されますか?そして、これはあなたの以前の質問と重複していないのはなぜですか? –

+0

はい、これらは2つの異なるコードです。彼らはお互いに何もする必要はありません。 最初のコードスニペット:_ selectionArgsで変数を渡す方法を実装していますArray._ 2番目のコードスニペット:傷が検出された_Points_ 重複としてマーク:多分この質問は重複と見なすことができます。データのサニタイズに関するもう一つの質問に答えてください。私は別の質問を作成することを考えました。 – Priya

答えて

1

値は、(それが別々のパラメータ値を持つことの全体のポイントです)、消毒する必要はありません。

sqlEscapeString()の目的は、SQLコマンドに入力できるように文字列をフォーマットすることです(つまり、一重引用符をエスケープし、他のすべての文字はSQL文字列内で意味を持ちません)。しかし文字列があることがわかっている場合は、代わりにselectionArgsを使用する必要があります。したがって、この関数は役に立ちません。

SQLコマンド自体で終わる文字列だけをサニタイズする必要があります。この場合、これはselectionになります。この値がユーザや他のアプリから来た場合、DELETE文が実際にどれくらいの量のものを管理するか(SQL関数を呼び出すか、データベースの他の部分にアクセスするサブクエリを実行することができます)。

実際には、完全なSQLパーサーが必要なため、SQLコマンドを含む文字列をサニタイズすることはできません。コンテンツプロバイダに外部コードが利用できる場合は、URIを介してのみ特定のアイテムを削除できるようにし、カスタムselectionを許可しないようにする必要があります。

関連する問題