Heim  >  Artikel  >  Backend-Entwicklung  >  PHP ermittelt, ob ein Bild vorhanden ist

PHP ermittelt, ob ein Bild vorhanden ist

(*-*)浩
(*-*)浩Original
2019-09-28 09:23:194474Durchsuche

In unserer täglichen Entwicklung müssen wir häufig beurteilen, ob das Bild vorhanden ist. Wenn es nicht vorhanden ist, wird das Standardbild angezeigt.

PHP ermittelt, ob ein Bild vorhanden ist

getimagesize()-Funktion (empfohlenes Lernen: PHP-Programmierung vom Einstieg bis zur Beherrschung)

getimagesize ist nicht Teil der GD-Erweiterung und kann von standardmäßig installiertem PHP verwendet werden. Sie können sich zunächst die Dokumentationsbeschreibung dieser Funktion ansehen:

http://php.net/manual/zh/function.getimagesize.php

Wenn die angegebene Datei kein gültiges Bild ist, wird false zurückgegeben. Es gibt auch ein Feld, das das Dokument angibt Geben Sie die zurückgegebenen Daten ein. Wenn Sie es nicht verwenden, um die Größe der Datei zu ermitteln, sondern um festzustellen, ob es sich bei der hochgeladenen Datei um eine Bilddatei handelt, scheint dies eine sehr gute Lösung zu sein. Dies erfordert natürlich das Blockieren möglicher Warnungen. Der Code ist wie folgt geschrieben:

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

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

Aber wenn Sie nur eine solche Überprüfung durchführen, haben Sie leider erfolgreich eine Webshell-Schwachstelle in den Code eingebaut.

Um dieses Problem zu analysieren, werfen wir zunächst einen Blick auf den Prototyp dieser Funktion:

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);
}

Der begrenzte Platz hat einige Details verborgen. Jetzt wissen wir zwei Dinge aus dem obigen Code. Das reicht:

Die endgültige Verarbeitungsfunktion ist php_getimagesize_from_stream

Die für die Bestimmung des Dateityps verantwortliche Funktion ist php_getimagetype

Werfen wir einen Blick auf die Implementierung von 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)) {
        ...
    }
}

Das obige ist der detaillierte Inhalt vonPHP ermittelt, ob ein Bild vorhanden ist. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn