Проверить изображение на наличие вредоносного кода и удалить его
Как я могу определить, содержит ли загруженное изображение вредоносный код, и удалить его из временной папки?
код:
$_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>