2017年1月13日金曜日

【備忘録】WordPress 4.7.1 よりメディアアップロード時のMIMEチェックにファイル本体のチェック機能が付与されていた・・・

あれ、PDFやPPTXがアップロードできなくなってる、、、って思って調べてみた所、つまりはそういうことだったのです。風邪引いてフラフラなのにマイナーバージョンアップで久々にデカイ変更されたなーという感じです。

wp-include/functions.php
2323行〜2333行 ( wp_check_filetype_and_ext 関数内)


のコードが、付与されていたってことです。

何が違うの?


画像の場合にも別途特殊な設定をいれていて、svgがアップロードされないよ〜っていうトラブルもあります。それは別問題のため
を参考にしてみてください。
また、画像以外アップロードできないよ〜っていうバグ報告もあります。PDFやPSDのアップロードできませんね...すべては次にあげる finfo_file 関数で未定義と出てしまう問題があるからのようですねぇ。

新しく追加されたコードは、finfo_file 関数によって中身の mime タイプをチェックし、本当にアップロードされたファイルが拡張子に割り当てられた mime タイプと一致するかチェックします。一致しなければ、セキュリティを理由としてアップロードが拒否されます。

  • ppt ファイルを pptx に拡張子だけ変更する
  • テキストファイルを、拡張子だけ pdf にする

いままでは拡張子だけでチェックされていたので、これもいけていましたが、WordPress 4.7.1 からは中身がテキストなのに拡張子が pdf っておかしいよね、、アップロード禁止しまーすっていうんです。

初期登録されていない拡張子は注意が必要


ならばちゃんしたファイルだったら全部オッケーかというとそうでもないのです。
WordPress側で初期登録されている拡張子は十分テストされているのでオッケーなはずですが、そうでない場合、たとえば mobi で例をあげますと、mobi は finfo_file では application/octet-stream と判定しますが、mime的には application/epub+zip にしたとします。そうするとエラーになってアップロードできないわけですね。

application/octet-stream

に設定してしまえばいいのですが、mobi 以外にもおなじようなことがあるかもしれません。その都度調べるのは面倒です。

追加した拡張子だったら、このコンテンツチェックを無視しちゃおう


仕方がないので、次善策になりますが、無視しちゃうコードをいれることにしました。その分、追加した拡張子の場合のみ WordPress 4.7 までのチェックに戻りますから、強化されたセキュリティ対策はそこだけ適応されないことになります。それがよいかどうかは、それぞれで判断してください。

具体的には、
  • return apply_filters( 'wp_check_filetype_and_ext', compact( 'ext', 'type', 'proper_filename' ), $file, $filename, $mimes );
へのフックになります。

ここでまた悩んだのですが、$mimes のデータがファイル名(拡張子含む)なのですよね。。そして戻り値が compact( 'ext', 'type', 'proper_filename' ) になると。この
 ext と type に値をいれて返してあげるとアップロードできるようになるってことになります。

add_filter( 'wp_check_filetype_and_ext', 'add_allow_upload_extension_exception',10,3);
function add_allow_upload_extension_exception( $file, $filename, $mimes ) {
  $ext = $type = $proper_filename = false;

  〜処理〜

   return compact( 'ext', 'type', 'proper_filename' );
}

でまぁそれを自前プラグインに実装「WP Add Mime Types」


風邪引いてダウン寸前のフラフラなのですが、なんとか頑張りました...

2017年1月13日 @kimipooh

3 件のコメント:

  1. こんにちは。ワードプレス初心者のものです。Word Press 4.7.4 でsimplicityを使っているのですが、PDFがアップロードできず、こちらの記事にたどりつきました。早速Kitaniさんが作成されたプラグインをインストールしてPDFを有効にしてみたのですが、何度やってもHTTPエラーが出てしまいます。ワードプレスが4.7.4にバージョンアップされたからでしょうか。他にもMime Type関連プラグインは入れていません。もしも原因などお分かりになりましたら、ご教示いただけますと幸いです。どうぞ宜しくお願いいたします。

    返信削除
  2. 一昨日コメントを記載したものですが、ワードプレスにPDFが貼れないので、一旦諦めてワードプレスを削除いたしました(http://megurokko.com/manga)。念のため、お伝えしておきます。

    返信削除
  3. GWはバタバタしていたのでご返事が遅れました。
    WordPress 4.7.4 であるなら、わたしのプラグインをいれなくても PDF がアップロードできるように、4.7.3 に修正されてます(参考:https://kitaney-wordpress.blogspot.jp/2017/03/wordpress-473.html)。そのため別の原因でアップロードできないのだろうと思います。たとえばサーバーにアップロードできる容量が制限されていて、少し大きなPDFファイルをアップロードしようとしてエラーになったとか。

    とりあえずその場合にはアップロードできないときに出たエラーなどを教えていただければ何かわかるかもしれません(例、http://itbenricho.com/wordpress-image-upload-error.html)。またブログは毎日みてない場合もあるので、https://ja.wordpress.org/support/ のフォーラムを活用されれば、わたしも含めて WordPress に詳しい人からのコメントを頂けると思います。

    返信削除