ホームページ > バックエンド開発 > PHPの問題 > phpは画像が存在するかどうかを判断します

phpは画像が存在するかどうかを判断します

(*-*)浩
リリース: 2023-02-25 10:56:02
オリジナル
4561 人が閲覧しました

日々の開発では、ピクチャが存在するかどうかを判断する必要があり、存在する場合は表示され、存在しない場合はデフォルトのピクチャが表示されます。

phpは画像が存在するかどうかを判断します

getimagesize() 関数 (推奨学習: PHP プログラミングの入門から習熟まで )

getimagesize 関数は GD 拡張機能の一部ではないため、標準でインストールされた PHP で使用できます。まず、この関数のドキュメントの説明を確認してください:

http://php.net/manual/zh/function.getimagesize.php
ログイン後にコピー

指定されたファイルが有効な画像ではない場合、false が返されます。ドキュメントを示すフィールドもあります。返されたデータを入力します。ファイルのサイズを取得するためにこれを使用するのではなく、アップロードされたファイルが画像ファイルであるかどうかを判断するために使用する場合、これは非常に良い解決策であると思われます。もちろん、これには、起こり得る警告をシールドする必要があります。コードは次のようになります:

<?php
$filesize = @getimagesize(&#39;/path/to/image.png&#39;);
if ($filesize) {
    do_upload();
}

# 另外需要注意的是,你不可以像下面这样写:
# if ($filesize[2] == 0)
# 因为 $filesize[2] 可能是 1 到 16 之间的整数,但却绝对不对是0。
ログイン後にコピー

しかし、このような検証を行っただけでは、残念ながら、コードに Webshel​​l の脆弱性を埋め込むことに成功したことになります。

この問題を分析するには、まずこの関数のプロトタイプを見てみましょう:

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);
}
ログイン後にコピー

スペースが限られているため、いくつかの詳細が隠されています。上記のコードから 2 つのことがわかります。これで十分です:

最終処理関数は 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 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
php
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート