2013-10-14 5 views
4

바이트 배열에 우편 스트림이 포함되어 있는지 어떻게 알 수 있습니까? 내 응용 프로그램은 Base64 인코딩을 사용하는 http 게시를 통해 다른 응용 프로그램의 파일을 가져옵니다. 파일을 전달하는 응용 프로그램의 구현에 따라 Base64 문자열에서 나온 바이트 배열을 gzip으로 압축 할 수 있습니다. 어떻게 gzip으로 압축 된 배열을 인식 할 수 있습니까? 어떤 방법을 찾았지만 누군가가 Zip 파일을 올리면 잘못 될 것이라고 생각합니다. prepared "bad" zip file바이트 배열이 gzipped인지 확인하는 방법

이것은 내가 발견하고 작동하지만 어떤 방식 으로든 악용 될 수 있습니까?

C#을

public static bool IsGZip(byte[] arr) 
{ 
    return arr.Length >= 2 && arr[0] == 31 && arr[1] == 139; 
} 

VB.NET

Public Shared Function IsGZip(arr As Byte()) As Boolean 
    Return arr.Length >= 2 AndAlso arr(0) = 31 AndAlso arr(1) = 139 
End Function 

IsGzip 내 응용 프로그램이 바이트 배열의 압축을 해제합니다 true를 돌려주는 경우.

+0

명시 적으로 형식을 지정하는 것이 훨씬 안전합니다. 재 설계를 고려하십시오. 나는. 'docx' (또는 다른 압축 된 문서 파일 형식)가 "Zip"또는 "단일 문서"로 간주됩니까? –

+4

[Gzip 용 RFC] (http://www.gzip.org/zlib/rfc-gzip.html)에 따르면 Gzip 스트림의 헤더는 항상 코드 스 니펫이 테스트중인 0x1F8B로 시작합니다. 헤더로 시작하지만 실제로 Gzip 콘텐츠가 아닌 임의의 파일을 업로드하는 경우 "거짓 긍정"을 줄 수 있습니다. 스트림의 CRC도 확인하면 훨씬 "긍정적 인"결과를 얻을 수 있습니다. 확실한 방법은 실제로 그것을 압축 해제하는 것입니다. – vcsjones

+0

파일을 전달하는 응용 프로그램은 파일이 압축 된 POST 데이터를 통해 플래그를 제공하는 외부 응용 프로그램이지만 일부 파일 유형임을 완전히 선언 할 수는 없습니다. 우리는 보안을 위해 우리 자신을 찾아야합니다. –

답변

2

세 번째 바이트가 8인지 확인한 다음 gunzip을 시도하십시오. 마지막 단계는 실제로 알 수있는 유일한 방법입니다. gunzip이 실패하면 스트림을 그대로 사용하십시오.

관련 문제