elFinderはPHPのpost_max_sizeとupload_max_filesizeを無視する

elFinderはブラウザで動作するファイルマネージャーで、サーバーやAWS S3やDropboxのファイルを扱えるツールである。サーバー側はPHPで動作するようになっている。

タイトルの「無視する」という表現は正確ではないが、アップロードするファイルの大きさを制限したいと思ったときに、サーバー側がPHPで動いているのだからphp.iniなどでpost_max_sizeとupload_max_filesizeを設定するのが普通の発想だと思うが、これが効かず、もっと大きなサイズのファイルもelFinderでアップロードできてしまう。なぜかと言うと、elFinderは分割アップロードに対応しているからである。

post_max_sizeとupload_max_filesizeは何か

どちらもPHPの設定項目で、post_max_sizeはPOSTする際のデータを受け入れ可能な最大サイズを、upload_max_filesizeはファイルをアップロードする際のファイルサイズの上限を定めている。post_max_sizeはそのPOSTでの合計データサイズなので、upload_max_filesizeをpost_max_sizeより大きくしても意味はない。複数ファイルを同時アップロードするときは、1個1個がupload_max_filesizeより小さくないといけないし、合計サイズがpost_max_sizeより小さくないといけない。普通に<input type="file">でフォームを作るとこの制限に従わなくてはいけない。

elFinderでは?

elFinderでファイルをアップロードする場合はこれらの制限を実質無視できることになる。もちろんpost_max_sizeかupload_max_filesizeのどちらかが0になっていて、一切アップロードができない設定の場合はelFinderでもアップロードはできなくなるが、ごく小さなファイルをアップロードできる設定になっていれば、elFinderはその設定を検知して、アップロード可能なファイルサイズに分割してアップロードしようとする(chunked uploading)*1。これによりどんなに大きいファイルでもアップロードできることになる*2

ではelFinderでアップロードサイズを制限したい場合は?

このままだと例えばelFinderにアクセス可能な人に悪意があったり、ふといたずらを思いついたりして、1TBのファイルをアップロードするとかも可能になってしまうので、アップロードできるファイルサイズの上限を設定しておいた方がよい。uploadMaxSizeという項目で設定できる。これはサーバー側に設置するphpスクリプト内で指定する。

 

PHPの方で上限を設定しているのにelFinderだとそれ以上のファイルもいくらでもアップロードできてしまう、なんで???となったので、ここに調べた内容をまとめておく。上限に引っかかってアップロードできない、困ったみたいな情報はいくらでも出てくるのだが、上限の設定が効かなくて困ったという話はあまり見かけなかった。おそらく分割アップロードをサポートし始めたのもわりと最近なのだろう。

*1:実際のところ、若干のマージンを取っているので、例えばpost_max_sizeが1とかだとアップロードはできない。

*2:こちらも実際はPHP_INT_MAXが上限となる。普通はその前にサーバーのストレージサイズが問題になるけど。