GIMP は無料の画像編集ソフトです。自分もしばしばお世話になります。
GIMP – GNU Image Manipulation Program
GNOME / GIMP · GitLab
GIMPで画像を編集して、アップロードしようとすると弾かれる場合がしばしばあります。これはファイルサイズが大きすぎたり、ファイル形式が想定されない形式であったりする時がほとんどですが、そうでない場合もあります。そうでない時のエラーは 501 Not Implemented、400 Bad Request、黙って死ぬ、など様々です。これのよくある原因と解決方法を紹介します。
原因として保存した画像ファイルが受け手側のプログラムのセキュリティルールに引っ掛かっている場合が考えられます。次の様に画像がセキュリティ的に問題がないけ形式で保存し、それをアップロードすると解決しやすいです。
ここからもう少し踏み込んだ解説です。上記の画像が引っ掛かるセキュリティルールは多くの場合、WAF(Webアプリケーションファイアウォール)の不正アクセス検知ルールです。AWS(Amazon Web Services)やレンタルサーバーなどによく入っています。これは不正なアクセスによってシステムに被害を与えられるリスクを低減するという点で便利なものですが、誤検知も起こします。この誤検知はファイルのメタ情報、特に Extensible Metadata Platform (XMP) によって起きやすいです。GIMP でいう Save XMP data のチェックで保存されるようになるデータです。
Extensible Metadata Platform – Wikipedia
これは次の様にファイルの中にメタデータを埋め込む場合の規格です。この規格によって正常で安全ではあるが、タグを内部に持つファイルが生まれます。
タグはタグ以外の文字列に比べて危険です。画像の中に入っているタグ、PDFの中に入っているタグ、いずれもファイルも使い方次第で脆弱性につながります。例えば画像の内部に<?php phpinfo(); >
と値を持つファイルがあれば、それを PHP ファイルとして読み込むだけで phpinfo が実行されます。script タグを追加して HTML 的に読ませれば XSS が完成します。この様な危険を避けるために WAF はしばしばタグ文字列入りのファイルを弾きます。この記事で紹介した解決法は WAF から見ても文句なしに問題のないファイルとしてエクスポートする、というものです。
記事内では GIMP から出力した画像と限定しましたが、このエラーは PDF ファイルでも、GIMP 以外で生成された画像ファイルでも起こりえます。プログラム的にはどう見ても問題ないし処理が成功する場合もある、という時はこれを疑ってみるのも手です。