0

Veracode Static Scan 보고서는 컨텐츠 공급자 구현에서 SQL 주입 취약점을 지적합니다.selectionArgs 배열에 전달 된 모든 변수를 삭제하는 방법은 무엇입니까?

이전에이 결함에 관한 모든 의문점과 관련하여 question을 게시했습니다.

그리고 몇 번의 토론을 거친 후에 보고서에서 오탐의 가능성이 있음을 알게되었습니다. 내가 조사하고 읽은 바에 따르면 안드로이드에서 언급 한 보안 가이드 라인 인 docsother referenced sources을 따르므로 SQL 삽입을 피하려고합니다.

SQL 쿼리에 전달 된 데이터에 대해 최소한 일부 입력 유효성 검사를 수행 할 수있는 제안이 곳곳에 있습니다. 결함 가능성이있는이 가능성을 다루고 싶습니다. 누구나 질의에 전달하기 전에 데이터를 살균하도록 요청하고 있습니다. 콘텐츠 공급자의 delete(), update() 메서드에 전달 된 selectionArgs 배열에 전달 된 변수를 정확하게 sanitize하려면 어떻게해야합니까?

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); 아래의 코드에서 다음 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

두 코드가 서로 어떻게해야할까요?'delete'는 어디에서 호출 되었습니까? 그리고이 질문이 이전 질문과 중복되지 않는 이유는 무엇입니까? –

+0

예, 두 가지 코드가 있습니다. 그들은 서로 아무 것도 할 필요가 없습니다. 첫 번째 코드 단편 : _ selectionArgs Array._ 에서 변수를 전달하는 방법을 구현을 보여줍니다. 두 번째 코드 단편 : _ 결함이있는 지점 _ 중복으로 표시 :이 질문은 중복으로 간주 될 수 있습니다. 데이터 sanitizing에 대한 또 다른 질문에 대한 대답을 얻으십시오. 그래서 나는 다른 질문을 만들 생각을했습니다. – Priya

답변

1

값은 SQL 명령 (즉, 별도의 매개 변수 값을 갖는의 요점이다)으로 해석 할 수 없기 때문에, 살균 필요가 없습니다.

sqlEscapeString()의 목적은 문자열을 SQL 명령에 넣을 수 있도록 형식을 지정하는 것입니다 (즉, 작은 따옴표를 이스케이프하고 다른 모든 문자는 SQL 문자열 내에서 의미가 없음). 그러나 문자열이 있다는 것을 알게되면 selectionArgs을 대신 사용해야하므로이 함수는 도움이되지 않습니다.

SQL 명령 자체에서 끝나는 문자열 만 살균해야합니다. 이 경우 selection이됩니다. 이 값이 사용자 또는 다른 응용 프로그램에서 오는 경우 DELETE 문이 실제로 수행하는 작업 (SQL 함수를 호출하거나 데이터베이스의 다른 부분에 액세스하는 하위 쿼리를 실행할 수 있음)을 제어 할 수 없습니다.

실용적인 목적으로 전체 SQL 구문 분석기가 필요하기 때문에 SQL 명령을 포함 할 문자열을 삭제할 수 없습니다. 콘텐츠 공급자가 외부 코드를 사용할 수있는 경우 URI를 통해서만 특정 항목을 삭제하도록 허용하고 맞춤 selection을 허용하지 않아야합니다.

관련 문제