우리 일상생활에서 사진이 있는지 판단해야 하는 경우가 많습니다. 존재하면 표시되고, 없으면 기본 사진이 표시됩니다.
getimagesize() 함수 (권장 학습: PHP 프로그래밍에서 마스터까지)
getimagesize 함수는 GD 확장의 일부가 아니며 표준 설치된 PHP에서 이 함수를 사용할 수 있습니다. 먼저 이 함수에 대한 문서 설명을 살펴보세요.
http://php.net/manual/zh/function.getimagesize.php
지정된 파일이 유효한 이미지가 아니면 false가 반환됩니다. 반환된 데이터에는 문서 유형을 나타내는 필드도 있습니다. 파일의 크기를 알아내는 데 사용하지 않고 업로드된 파일이 이미지 파일인지 확인하는 데 사용한다면 매우 좋은 해결책인 것 같습니다. 물론 이는 가능한 경고를 차단해야 합니다. 코드는 다음과 같습니다:
<?php $filesize = @getimagesize('/path/to/image.png'); if ($filesize) { do_upload(); } # 另外需要注意的是,你不可以像下面这样写: # if ($filesize[2] == 0) # 因为 $filesize[2] 可能是 1 到 16 之间的整数,但却绝对不对是0。
하지만 이런 종류의 확인을 수행하면 불행하게도 코드에 웹셸 취약점을 성공적으로 심은 것입니다.
이 문제를 분석하기 위해 먼저 이 함수의 프로토타입을 살펴보겠습니다.
static void php_getimagesize_from_stream(php_stream *stream, zval **info, INTERNAL_FUNCTION_PARAMETERS){ ... itype = php_getimagetype(stream, NULL TSRMLS_CC); switch( itype) { ... } ... }static void php_getimagesize_from_any(INTERNAL_FUNCTION_PARAMETERS, int mode) { ... php_getimagesize_from_stream(stream, info, INTERNAL_FUNCTION_PARAM_PASSTHRU); php_stream_close(stream); } PHP_FUNCTION(getimagesize) { php_getimagesize_from_any(INTERNAL_FUNCTION_PARAM_PASSTHRU, FROM_PATH); }
제한된 공간으로 인해 일부 세부 정보가 숨겨져 있습니다. 이제 위 코드에서 두 가지 사실을 알 수 있습니다.
최종적으로 처리된 함수는 php_getimagesize_from_stream
입니다.파일 유형을 결정하는 함수는 php_getimagetype입니다
php_getimagetype의 구현을 살펴보겠습니다:
PHPAPI int php_getimagetype(php_stream * stream, char *filetype TSRMLS_DC){ ... if (!memcmp(filetype, php_sig_gif, 3)) { return IMAGE_FILETYPE_GIF; } else if (!memcmp(filetype, php_sig_jpg, 3)) { return IMAGE_FILETYPE_JPEG; } else if (!memcmp(filetype, php_sig_png, 3)) { ... } }
위 내용은 PHP는 이미지가 존재하는지 확인합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!