アップロードファイルのMIME-Type問題。
実際引っかかったのは初めて。
網羅は当然大変なので、自分が引っかかった箇所のみ
概要
- firefoxからのzipファイルアップロードが弾かれていた
- IEを使うか、拡張子を消すことで回避していたらしい
- 原因はPHPのzipファイル判定
- MIME-Typeがfirefoxのみ
application/x-zip
- ブラウザによって扱いが違うから注意
- そもそも、書き換え可能な箇所なので鵜呑みにするな
きょうの嫌コ(ード)
if ( !eregi("x-zip-compressed" , $_FILES['userfile']['type'])
&& !eregi("octet-stream" , $_FILES['userfile']['type'])
&& !eregi("force-download" , $_FILES['userfile']['type'])
{
$echo = "zipファイルではありません。";
}
ereg
使っている
if文わかりづらい→ド・モルガンの法則1
firefoxからのアップロードがzip扱いされない
検証
コード
form.html
<!DOCTYPE html>
<html>
<body>
<form enctype="multipart/form-data" action='post.php' method='post'>
<input type='file' name='userfile'/>
<input type='submit' />
</form>
</body>
</html>
post.php
<?php
var_dump($_FILES['userfile']['type']);
結果
ブラウザ | zip | 拡張子削り |
---|---|---|
IE 11 | application/x-zip-compressed | application/x-zip-compressed |
Chrome 43 | application/x-zip-compressed | application/octet-stream |
firefox 38 | application/x-zip | application/octet-stream |
Win10 build 10130 Spartan 152 | application/x-zip-compressed | application/x-zip-compressed |
仮にIEでzipファイルの判定に失敗していたら、「拡張子消せば通る」という迂回策も失敗していたわけか…
結論
!eregi("x-zip" , $_FILES['userfile']['type'])
足せばいいんじゃないでしょうか
!eregi("x-zip-compressed" , $_FILES['userfile']['type'])
も内包しちゃうと思いますが