Проверить изображение на наличие вредоносного кода и удалить его

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

код:

$_FILES['file']['tmp_name']

насколько я знаю, нет способа остановить его попадание в папку /tmp

Я прочитал, что я мог бы использовать

$file_data = getimagesize($_FILES['file']['tmp_name']);        
if(is_array($file_data) && strpos($file_data['mime'],'image') !== false)
{
    echo "Image";
}  

но насколько это надежно?

3 ответа

Попробуйте изменить размер загруженного изображения с помощью функции imagecopyresized, Если размер изменен успешно, это означает, что файл является изображением. Если нет, удалите его.

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

http://josephkeeler.com/2009/04/php-upload-security-the-1x1-jpeg-hack/

Как предотвратить каждую загрузку вредоносного файла на мой сервер? (проверьте тип файла)?

Я опубликую еще 2 ссылки из OWASP, так как у меня недостаточно репутации для этого.

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

#!/bin/bash
SEARCH_DIR="/tmp"  # change this to your upload dir
PATTERNS="preg_replace\(\.\*\/e|passthru|shell_exe|my_delimdelimUploaded|myshellexec|PHPShell|FilesMan"

egrep --color -Rli --include=*.{jpg,jpeg,gif,png} "$PATTERNS" $SEARCH_DIR

Надеемся, что скрипт поможет обезопасить часть вредоносного кода, вы можете активировать свой черный дыр IP-адрес и отправить соответствующее сообщение.

Кроме того, вы также можете отключить исполняемую привилегию в / tmp или в папке загрузки, используя опции "noexec" и "nosuid" в /etc/fstab (это для FreeBSD).

Этот вопрос существует около 1 года назад, но, возможно, проблема возникла еще у других людей, поэтому я поставил решение здесь, оно сработало для меня, надежда работает и для вас

<?php
if(isset($_POST['submit']) && !empty($_FILES['ufile']['name'])) {
        $fileext = explode(".",$_FILES['ufile']['name']);
        $fileext = $fileext[sizeof($fileext)-1]; // fetching extension of temp file
        $filename = $_FILES['ufile']['name'];

        if (strtolower($fileext) == "jpg" || strtolower($fileext) == "jpeg" || strtolower($fileext) == "gif" || strtolower($fileext) == "png") {
            $f=fopen($_FILES['ufile']['tmp_name'],'r');
            $content="";
            echo $f;
            while(!feof($f))
            {
                $content .= fgets($f);
            }

            /* Add the words(tages) or any suspect words you wanna to block uploading based on them */
            $forbidden = array("html",
                                "php",
                                "form",
                                "script",
                                "java",
                                "div",
                                "table",
                                "span",
                                "tr",
                                "td",
                                "th",
                                "submit",
                                "body",
                                "head",
                                "var",
                                "function");
            foreach($forbidden as $forbidword)
                if(strpos($content, $forbidword) !== false)
                    die("Error: Malicious image cannot upload!");

            if (move_uploaded_file($_FILES['ufile']['tmp_name'], "./".$filename)) {

                echo "
                The file was uploaded succesfully <br/>

                    Details : <br>

                    Link : ".$filename."<br />

                    File Name : ".$filename." <br>

                    File Size : ".($_FILES['ufile']['size']/1000)." KB <br>

                    File Type : ".$_FILES['ufile']['type'];
                      } else{
                      echo "An unexpected error : ".error_log();
                      }

    } else {
        echo "Only file with this extentions allow to upload :"."JPG, JPEG, GIF, PNG";

    }
}
?>
<!DOCTYPE html>
<html>
<body>
<form action="" method="POST" name="addnews" enctype="multipart/form-data">
 <input type="hidden" name="MAX_FILE_SIZE" value="4000000" /> 
    <label class="title">Choose an image file:
    <input type="file" name="ufile" />
    </label>
    <br />
    <input name="submit" type="submit" value="Upload Media" />
</form>
</body>
</html>
Другие вопросы по тегам