Maison > développement back-end > Problème PHP > php détermine si l'image existe

php détermine si l'image existe

(*-*)浩
Libérer: 2023-02-25 10:56:02
original
4561 Les gens l'ont consulté

Dans notre développement quotidien, nous devons souvent juger si l'image existe. Si elle existe, elle sera affichée. Si elle n'existe pas, l'image par défaut sera affichée.

php détermine si l'image existe

Fonction getimagesize() (apprentissage recommandé : Programmation PHP de l'entrée à la maîtrise)

getimagesize ne fait pas partie de l'extension GD et peut être utilisée par PHP installé en standard. Vous pouvez d'abord jeter un oeil à la description de la documentation de cette fonction :

http://php.net/manual/zh/function.getimagesize.php
Copier après la connexion

Si le fichier spécifié n'est pas une image valide, false sera renvoyé Il y a aussi un champ indiquant le document. saisissez les données renvoyées. Si vous ne l'utilisez pas pour obtenir la taille du fichier mais que vous l'utilisez pour déterminer si le fichier téléchargé est un fichier image, cela semble être une très bonne solution. Bien sûr, cela doit bloquer d'éventuels avertissements. le code est écrit comme ceci :

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

# 另外需要注意的是,你不可以像下面这样写:
# if ($filesize[2] == 0)
# 因为 $filesize[2] 可能是 1 到 16 之间的整数,但却绝对不对是0。
Copier après la connexion

Mais si vous faites simplement une telle vérification, alors malheureusement, vous avez réussi à implanter une vulnérabilité Webshell dans le code.

Pour analyser ce problème, jetons d'abord un coup d'œil au prototype de cette fonction :

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);
}
Copier après la connexion

L'espace limité a caché certains détails. Nous savons maintenant deux choses du code ci-dessus. Cela suffit :

La fonction de traitement final est php_getimagesize_from_stream

La fonction chargée de déterminer le type de fichier est php_getimagetype

Jetons un coup d'œil à l'implémentation de 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)) {
        ...
    }
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
php
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal