画像を直接上げてはいけない原因を調べたところ、 Webで画像を表示する場合、imgのsrc属性に画像が置いてあるURLを指定するというのが一般的だと思います。

PHP97閲覧xmlns="http://www.w3.org/2000/svg">25

ベストアンサー

0

外部からアクセスできる場所にアクセス・実行できるファイルを一個置かれただけで、かなりのことができるようになりますと以前指摘を受けまして。 本来ならアップロードした時点でファイルを調べて、それでOKであれば (例えばちゃんと画像ファイルなのかどうか等) 公開フォルダへコピーするなりするべきだといわれました。 そこで画像をbase64でエンコードされた文字列をGETパラメータで渡すようにしたのですが、 base64はただのエンコードなので誰でもデコード出来るという問題もあるようです。 画像を表示する際に外部からアクセスできないようするにはどのようのな方法が有効でしょうか?

ThanksImg質問者からのお礼コメント

とても丁寧に教えていただきありがとうございました

お礼日時:8/30 19:37

その他の回答(3件)

0

>画像を直接上げてはいけない 「アップロードしたデータをノーチェックでそのまま直接アクセスできるところに置いてはいけない」 という事で、ピントがズレていると思う >画像をHTMLやCSSに埋め込めるようにする為に、画像をbase64にエンコードします エンコードする事で何等かのガードを掛けたつもりかもしれないけれど、ほとんど意味が無い >base64_encode(file_get_contents('画像URL')); '画像URL'って、自サイトじゃなく別の所のヤツなの? 自サイトの画像ファイルへのパスを'URL'って表記してるだけ? >画像を表示する際に外部からアクセスできないようするにはどのようのな方法が有効でしょうか? アップロード時のファイル名を元のものから変更する 画像ファイルである事を確認する 必要ならサイズやビット深度を変更する 自サイトのページ内に配置された画像としてしかアクセスを禁止する (例えばそのページを生成する際にトークンや暗号化キーを付けてアクセスする様にするとか) なんてのが考えられる

0

#あぁ、ファイルアップロードで保存するファイルの話なんですね(汗 そもそも「アップロードされたファイル」がちゃんと画像ファイルかどうか調べないとダメです。 $_FILES[]['name'] による「ファイル名」の拡張子や、$_FILES[]['type'] での MIMEタイプなどをアテにしてはいけません。これらの値はクライアント側でセットされるので詐称可能です。 アテにしていいのは $_FILES[]['error'] と $_FILES[]['tmp_name'] だけと言ってもいいです(正常にアップロードされたかと、それを保存しているテンポラリファイルのpath)。 あ、$_FILES[]['size'] も大丈夫ですね。滅多に使うことがないので(画像の縦横サイズの方が重要なので)アレですが。 ・https://www.php.net/manual/ja/function.finfo-file.php FILEINFO_MIME_TYPE が imahe/jpegなどの期待する内容かどうか。 ・https://www.php.net/manual/ja/function.getimagesize.php 画像サイズが適切な範囲内かどうか(最大サイズを超える場合はリサイズ処理を組み込む)。

(例) $allow_types = ['image/jpeg', 'image/png']; while ($_FILES) { $finfo = new finfo(FILEINFO_MIME_TYPE); $type = $finfo->file($_FILES['upfile']['tmp_name']); if (!in_array($type, $allow_types)) { $errmsg = "アップロードできないファイル種別です。"; break; } printf('%s', $type); // デバッグ用 // ファイルサイズチェックして、move_uploaded_fileする break; }

0

元のファイルをそのまま使わせないのは、 ・ブラウザの脆弱性を突いてなにか悪いことをする画像じゃないか ・そうでなくても画像データ以外の部分にボットへの命令を仕込んだ画像じゃないか ・GPS内蔵スマホで撮影すると緯度経度入ってるよね ・サーバーや閲覧者の手に余るくらいの超巨大な画像をアップロードされたらどうするのか などなどの問題のためです。これはimg src= でファイルを指定しようが、BASE64で埋め込もうが同じことです。 なので、サーバー側ででかすぎる画像は縮小する、余分なデータは取り除いておく、といったサニタイズ(無害化)を行うようになったわけです。

あと、スマホ時代の今はもうないかもしれませんが、ガラケー時代はメーカーや端末によって画面解像度や読める画像フォーマットが違ったりしたので、元画像を1個用意しておけばそこらへんの変換をアクセスしてきた機種に応じて自動的にやってくれるサービスもありました。