PHP getimagesize Let’s Encryptルート証明書「DST Root CA X3」が期限切れ対応:その3

PHP

Let’s Encryptのルート証明書が変わったことによって色々対応が必要に迫られたのでやったことを残していくよ。今回はphpのgetimagesize。

PHP getimagesize

結論で言うと、getimagesizeは諦めたほうが良さそうです。代わりにcurlを使いましょう。
以下にgetimagesizeの変わりに使える関数を記載しておきます。
ほとんど同じ挙動を返すので困らないと思います。

function getImage($url, $referer = '') {
$default = array('width' => 0, 'height' => 0, 'mime' => NULL, 'resource' => NULL);

// set headers
$headers = array('Range: bytes=0-131072');

if (!empty($referer)) {
array_push($headers, 'Referer: ' . $referer);
}

// set curl config
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

$data = curl_exec($ch);

$http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$curl_errno = curl_errno($ch);

curl_close($ch);

// valid stauts
if ($http_status >= 400) {
return $default;
}

// set stream config
stream_context_set_default([
'ssl' => [
'verify_peer' => false,
'verify_peer_name' => false,
],
]);

$mime = (!empty(get_headers($url, 1)['Content-Type'])) ? get_headers($url, 1)['Content-Type'] : false;
$mime = (is_array($mime) && $mime) ? end($mime) : $mime;

// valid image types
if (!$mime || !preg_match('/png|jpe?g|gif/i', $mime)) {
return false;
}

$image_resource = imagecreatefromstring($data);

if (!$image_resource) {
return $default;
}

return [imagesx($image_resource), imagesy($image_resource), $mime, $image_resource];
}

以下がレスポンス。

array (size=4)
'0' => int 640
'1' => int 480
'2' => string 'image/jpeg' (length=10)
'3' => resource(6, gd)

コメント

タイトルとURLをコピーしました