PHP: Как правильно проверить MIME-тип файла? - PullRequest
1 голос
/ 30 января 2020

У меня есть вход, куда вы можете загружать изображения, только разрешенные типы изображений:

png, jpg, jpeg

перед тем, как изображение будет вставлено в базу данных, оно проверяет, являются ли изображения png, jpg, jpeg. Но теперь по соображениям безопасности мне нужно проверить тип пантомимы до или после первой проверки.

Как мне это сделать? Это мой код:

<?php

$iAmountOfFiles = count($_FILES['Filename']['name']);

while($iAmountOfFiles >= 1) {

    $iAmountOfFiles--;

    $aFileProperties = pathinfo($_FILES['Filename']['name'][$iAmountOfFiles]);
    if(!in_array(strtolower($aFileProperties["extension"]), $aExtensionWhitelist)) {
        echo "Bestands type niet toegestaan";
        // exit;
        continue;
    }

    $sTarget = ROOT.BACKEND."/pages/bezienswaardigheden-toevoegen/uploads/";
    $sUniqueFileNameHash = hash('adler32', time().rand());
    $Filename = basename($sUniqueFileNameHash."-".$_FILES['Filename']['name'][$iAmountOfFiles]);
    $Filename = basename($aFileProperties["filename"]."-".$sUniqueFileNameHash.".".strtolower($aFileProperties["extension"]));

    // Writes the Filename to the server
    if(move_uploaded_file($_FILES['Filename']['tmp_name'][$iAmountOfFiles], $sTarget.$Filename)) {

    // here needs to come the mime check

1 Ответ

0 голосов
/ 30 января 2020

Чтобы получить MIME-тип, разработчики обычно зависят от $_FILE['input_name']['type']. Но это абсолютно уязвимо. Поскольку злонамеренный пользователь может установить один из image/jpg, image/png, image/gif et c. MIME печатает на файл, который на самом деле не является изображением. В этом случае злонамеренный пользователь может получить ваш скрипт для загрузки другого файла вместо изображения и выполнить ваш скрипт для своих целей, что опасно.

Поэтому я рекомендую вам не зависит от следующего фрагмента, чтобы получить MIME файла

$_FILE['input_name']['type'];

Скорее, я бы рекомендовал использовать эту функцию mime_content_type() для получения типа MIME, но с помощью встроенной функции других PHP. И это is_uploaded_file() функция. Что он делает:

Это полезно, чтобы гарантировать, что злонамеренный пользователь не попытался обманом заставить скрипт работать с файлами, с которыми он не должен работать - например, / etc /passwd.

Такая проверка особенно важна, если есть вероятность, что что-либо, сделанное с загруженными файлами, может раскрыть их содержимое пользователю или даже другим пользователям в той же системе.

Таким образом, для правильной работы этой функции необходим специфицированный c аргумент . Проверьте код ниже:

if (is_uploaded_file($_FILE['input_name']['tmp_name'])) {
    // do other stuff
}

Эта функция возвращает true в случае успеха, false в противном случае. Так что если он вернет true, то с файлом все в порядке. Благодаря этой функции. Теперь в игру вступает функция mime_content_type(). Как? Посмотрите на код ниже:

if (is_uploaded_file($_FILE['input_name']['tmp_name'])) {
    // Notice how to grab MIME type
    $mime_type = mime_content_type($_FILE['input_name']['tmp_name']);

    // If you want to allow certain files
    $allowed_file_types = ['image/png', 'image/jpeg', 'application/pdf'];
    if (! in_array($mime_type, $allowed_file_types)) {
        // File type is NOT allowed
    }

    // Set up destination of the file
    $destination = '/path/to/move/your/file/';

    // Now you move/upload your file
    if (move_uploaded_file ($_FILE['input_name']['tmp_name'] , $destination)) {
        // File moved to the destination
    }
}

Кстати, для новичка , не пытайтесь использовать удаленный URL с этой функцией, чтобы получить MIME-тип. Код ниже не будет работать:

mime_content_type('http://www.example.com/uploads/example.png');

Но приведенный ниже код будет работать:

mime_content_type('/source/to/your/file/etc.png');

Надеюсь, вам понравится загружать файл с этого момента.

...