PHP Обнаружение, если ссылка URL-адреса исходного изображения приводит к "сломанному" изображению?

Предположим, у вас есть миниатюрный генератор script, который принимает исходные изображения в виде URL-адреса. Есть ли способ определить, является ли исходный URL "сломанным" - не существует или ведет к файлу без изображения?


Просто грубая сила, использующая getimagesize() или другая функция PHP GD, не является решением, поскольку может быть введено поддельное отклоненное URL-адрес, который может не быть изображениями (http://example.com/malicious.exe или тот же файл, но переименованный как http://example.com/malicious.jpg) - такие случаи могут быть легко обнаружены PHP перед вызовом GD. Я ищу предварительную дезинфекцию GD, прежде чем GD попробует его батальон при разборе файла.


в качестве первого шага, следующее регулярное выражение проверяет, является ли URL-адрес расширением изображения: preg_match('@(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?)([^\s]+(\.(?i)(jpg|png|gif|bmp))$)@', $txt,$url);

Ответы

Ответ 1

используйте file_exists функцию в php, вы можете проверить URL-адреса с ней.

См. документацию ниже, показывает, как проверить img... именно то, что вам нужно

FILE EXISTS - http://www.php.net/manual/en/function.file-exists.php#93572

URL EXISTS - http://www.php.net/manual/en/function.file-exists.php#85246


Здесь альтернативный код для проверки URL-адреса. Если вы проверите в браузере, замените \n на <br/>

<?php

$urls = array('http://www.google.com/images/logos/ps_logo2.png', 'http://www.google.com/images/logos/ps_logo2_not_exists.png');

foreach($urls as $url){
   echo "$url - ";
   echo url_exists($url) ? "Exists" : 'Not Exists';
   echo "\n\n";
}


function url_exists($url) {
    $hdrs = @get_headers($url);

    echo @$hdrs[1]."\n";

    return is_array($hdrs) ? preg_match('/^HTTP\\/\\d+\\.\\d+\\s+2\\d\\d\\s+.*$/',$hdrs[0]) : false;
}
?>

Выход выглядит следующим образом

http://www.google.com/images/logos/ps_logo2.png - Content-Type: image/png
Exists

http://www.google.com/images/logos/ps_logo2_not_exists.png - Content-Type: text/html; charset=UTF-8
Not Exists

Ответ 2

Я использовал следующее для обнаружения атрибутов для удаленных изображений

$src='http://example.com/image.jpg';
list($width, $height, $type, $attr) = @getimagesize($src);
Пример

(проверка содержимого stackoverflows "Карьера 2.0" )

$src='http://sstatic.net/ads/img/careers2-ad-header-so.png';
list($width, $height, $type, $attr) = @getimagesize($src);

echo '<pre>';
echo $width.'<br>';
echo $height.'<br>';
echo $type.'<br>';
echo $attr.'<br>';
echo '</pre>';

Если $height, $width и т.д. является нулевым, изображение очевидно не изображение или файл не существует. Использование cURL является чрезмерным и медленным (даже с CURLOPT_HEADER)

Ответ 3

Единственный надежный способ - запросить изображение с помощью file_get_contents() и узнать его тип изображения, используя getimagesize().

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

Это довольно ресурс, однако.

Вы можете вообще не делать никаких проверок на стороне сервера и добавлять событие onerror JavaScript в готовый ресурс изображения:

<img src="..." onerror="this.style.display = 'none'">

Ответ 4

try for local files

<?php 
if(file_exists($filename))
{
//do what you want
}
else
{
//give error that file does not exists
}
?>

для внешних доменов

$headers = @get_headers($url);
if (preg_match("|200|", $headers[0])) {
// file exists
} else {
// file doesn't exist
}

Также вы можете использовать запрос curl для того же самого.

Ответ 5

Быстрое решение для связи с поврежденными или не найденными изображениями
я предлагаю вам, чтобы не использовать getimagesize(), потому что он будет первым загружать изображение, тогда он будет проверять размер изображения +, если это не будет изображение, тогда он будет генерировать исключение, поэтому используйте ниже код

if(checkRemoteFile($imgurl))
{
//found url, its mean
echo "this is image";
}

function checkRemoteFile($url)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,$url);
    // don't download content
    curl_setopt($ch, CURLOPT_NOBODY, 1);
    curl_setopt($ch, CURLOPT_FAILONERROR, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    if(curl_exec($ch)!==FALSE)
    {
        return true;
    }
    else
    {
        return false;
    }
}

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

Ответ 6

Вы можете проверить код состояния HTTP (это должно быть 200) и заголовок Content-type (изображение/png и т.д.) ответа HTTP до того, как вы поместите фактическое изображение через генератор.

Если эти две предпосылки в порядке, после получения изображения вы можете вызвать getimagesize() на нем и посмотреть, не сломается ли он, что MIME тип возвращает и т.д.

Ответ 8

Событие ошибки

Выполните JavaScript, если при загрузке изображения возникает ошибка:

Событие onerror вызывается, если при загрузке внешнего файла (например, документа или изображения) произошла ошибка.

Пример:

<!DOCTYPE html>
<html>
<body>

<img src="image.gif" onerror="myFunction()">

<p>A function is triggered if an error occurs when loading the image. The function shows an alert box with a text.
In this example we refer to an image that does not exist, therefore the onerror event occurs.</p>

<script>
function myFunction() {
  alert('The image could not be loaded.');
}
</script>

</body>
</html>