Discourse가 업로드된 파일을 이미지로 잘못 감지하는 문제

이 문제에 대해 좀 더 파고들어 보았습니다.

간단히 말하면, 해당 파일이 이 유형의 파일과 동일한 시그니처로 시작하기 때문에 JPEG로 인식되고 있습니다.
Discourse에서 이 동작을 수정하는 것은 가능하지만, 수정 작업이 필요합니다. (끝에 참고)


아래는 기술적인 내용입니다.
이 문제는 여기서 시작됩니다:

FastImage 라이브러리가 파일을 열고 유형과 크기를 결정합니다.
예상하셨듯이, JPEG 유형을 반환합니다.

JPEG 시그니처가 어떤 모습인지 살펴보면 다음과 같습니다:

JPEG 마커

더 많은 정보: List of file signatures - Wikipedia
JPEG - Wikipedia

항상 다음 마커 바이트로 시작합니다: FF D8

Hex 편집기로 파일 샘플을 살펴보면, 동일한 방식으로 시작하는 것을 볼 수 있습니다.

이제 FastImage가 JPEG를 어떻게 감지하는지 살펴보면, 여기서 확인할 수 있습니다:

그러나 필요한 모든 바이트가 존재하지 않으므로 이미지 정보를 추출할 수 없습니다.

Discourse에서 이 문제를 어떻게 수정할 수 있을까요?
FastImage 코드를 살펴보면, 전달할 수 있는 유용한 옵션이 하나 있습니다.

이 옵션을 사용하면 모든 오류(SizeNotFound, ImageFetchFailure, CannotParseImage, UnknownImageType, BadImageURI)에서 이미지 정보가 반환되지 않으며, 파일이 이미지로 감지되지 않습니다.

@image_info =
begin
   FastImage.new(@file, :raise_on_failure=>true)
rescue StandardError
   nil
end
...
is_image ||= @image_info && FileHelper.is_supported_image?("test.#{@image_info.type}")

그런 다음, 이제 작동합니다:

나중에 PR을 만들 수 있습니다. 이 옵션을 사용하는 것이 여기서는 합리적입니다. :+1: