0

重複の可能性:
URLがPHPの画像であるかどうかを判断するための最良の方法

編集:

file_get_contents(ホストで許可されている)を使用してリモートファイルをサーバーにコピーし、ユーザーが写真を共有できるようにするスクリプトがあります。ただし、悪用を避けるために、ファイルのサイズ、有効性(およびサーバーで許可する前に悪意のあるコード)をチェックするコードが必要です。これまでのところ、堅牢なソリューションを見つけることができませんでした。これです:

https://stackoverflow.com/questions/676949/best-way-to-determine-if-a-url-is-an-image-in-php

考えられるアプローチを提案します。ファイル拡張子、mimeタイプを確認し、サーバー上にあるファイルに対してGDを使用しますが、絶対確実なものはないことに注意してください。しかし、無数のサイトがファイルのリモートアップロードを許可しており、セキュリティを処理するためのより良い方法が必要であることを示唆しています。

File_get_uploadは必要最低限​​のものです。カールは危険ですが、より多くの機能を備えている場合があります。ファイルが次のように画像でない場合、GDのget_image_size関数はfalseを返します。

$imginfo_array = getimagesize($tempFile); 

ただし、GDはファイルをリモートで処理できないことを理解しています。

この段階でfile_get_contentsを使用する簡単なコードは次のとおりです。

$url = 'http://example.com/image.php';
$img = '/my/folder/flower.gif';
file_put_contents($img, file_get_contents($url));

これがcurlバージョンです:

$ch = curl_init('http://example.com/image.php');
$fp = fopen('/my/folder/flower.gif', 'wb');
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_exec($ch);
curl_close($ch);
fclose($fp);

サーバーに保存する前にファイルサイズと有効性を確認するためのベストプラクティスを知っている人はいますか?

4

1 に答える 1

1

stream_get_meta_dataheader informationまたは、extensionまたはを使用mime informationすることが最善の解決策であるとは本当に思いません...なぜですか?

偽の PNG 画像を作成すると、

  • 偽のマイム
  • 偽の作成日
  • 偽の修正日
  • 偽のファイル拡張子

欠落している機能

  • 偽の出力
  • フェイクサイズ

ケース1

$fake = "http://i.stack.imgur.com/wbSmq.png";
$meta = stream_get_meta_data(fopen($fake, 'rb'));
var_dump($meta);

出力

array (size=10)
  'wrapper_data' => 
    array (size=12)
      0 => string 'HTTP/1.0 200 OK' (length=15)
      1 => string 'Accept-Ranges: bytes' (length=20)
      2 => string 'Cache-Control: max-age=315360000' (length=32)
      3 => string 'Content-Type: image/png' (length=23)
      4 => string 'Date: Mon, 03 Dec 2012 10:41:08 GMT' (length=35)
      5 => string 'ETag: "add48f1871182328f5d8ebe74c1df32d"' (length=40)
      6 => string 'Expires: Thu, 31 Dec 2037 23:58:38 GMT' (length=38)
      7 => string 'Last-Modified: Mon, 03 Dec 2012 10:29:40 GMT' (length=44)
      8 => string 'Server: ECAcc (cdg/44CF)' (length=24)
      9 => string 'X-Cache: HIT' (length=12)
      10 => string 'Content-Length: 167' (length=19)
      11 => string 'Connection: close' (length=17)
  'wrapper_type' => string 'http' (length=4)
  'stream_type' => string 'tcp_socket/ssl' (length=14)
  'mode' => string 'rb' (length=2)
  'unread_bytes' => int 167
  'seekable' => boolean false
  'uri' => string 'http://i.stack.imgur.com/wbSmq.png' (length=34)
  'timed_out' => boolean false
  'blocked' => boolean true
  'eof' => boolean false

上記の出力から、画像が偽物であることを示唆するものは何もありませんか?

ケース 2

私の知る限り、リモート URL で GD を直接使用することはできません。

それは真実ではありませんgetImageSizeはGD関数であり、リモートURLで動作し、偽の画像を識別するための信頼性がはるかに高くなります.

$fake = "http://i.stack.imgur.com/wbSmq.png";
$meta = getimagesize($fake);
var_dump($meta);

出力

array (size=6)
  0 => int 1                     |
  1 => int 1                     |=----------------- Looks Fake
  2 => int 3                     |
  3 => string 'width="1" height="1"' (length=20)
  'bits' => int 1   <------------------------------- fake
  'mime' => string 'image/png' (length=9) ---------- mime may be correct 

あなたThe goal here is to let users share valid pictures up to a certain sizeが言及しgetImagesizeたように、より信頼性の高いソリューションを使用する場合

于 2012-12-03T10:47:20.020 に答える