というリクエストが来ました。内容としては、拡張子が複数ある場合への対応です。
具体的には、 *.min.css や *.min.js などのケースですよね。
wp add mime types の仕様関連
- データのMIMEチェックをスルーする
- マルチサイト対応(全体追加したら個別追加は無効化 / データは保持される)
- (今回)複数拡張子対応
WordPress は拡張子が複数ある場合にファイル名をサニタイズにしてしまう
参考:WordPressでアップロードする時に余分な”_”が追加される(プラスα空間)
対応自体はそれほど難しくないのですが、WordPressのファイルアップロードに対するフックで、そのあたりをサポートしていないのにはなにか理由があるはず!ということで、WordPress のソースを漁ってみたら
wp-includes/formatting.php の sanitize_file_name 関数内にありました。
まず、拡張子が1つのケース(hogehoge.jpg など)ではサニタイズしません。それは上記のコードで明らかです。では複数の場合にはどうでしょうか。
コメントにも書かれていますが、
- 拡張子は一番最後に発見されたドット(.)を起点とする
- それ以前に発見されたドット(.)について 2文字〜5文字の範囲かつ許可された拡張子以外なら、ドット(.)の前にアンダーライン(_)を挿入する
の2点です。. が _. になってもセキュリティ面でのサニタイズ処理ではないので、ドット(.)が複数あることに対する何らかのポリシーがあるのでしょう。その理由は少しネット検索しましたが見つけることができませんでした。
しかし、それでは困るケースもあります。ファイル名に複数拡張子がついているケースは珍しくないためです。実際に WordPress でも *.min.css 等で使われているケースがあります。たとえば、自作したコードをアップロードしてサイトで提示したい場合に、ファイル名が *.min_.css となってしまうと、ダウンロードもその名前になってしまって混乱を生んでしまいます。
そうしたことを考えた上で、wp add mine types では複数拡張子に対応することにしました。
アプローチ
最初に考えたのが、次のことでした。しかし、後述する問題があるのでプラグインでは実装しませんでした(実際には実装を試して動作確認までしましたが、やめたという感じですね)
- ファイル名に存在する拡張子すべてを許可する
こうすることで先程の2番目の条件
- それ以前に発見されたドット(.)について 2文字〜5文字の範囲かつ許可された拡張子以外なら、ドット(.)の前にアンダーライン(_)を挿入する
しかしプラグイン側でそれをやると意図しない拡張子も許可してしまうことになります。ですのでプラグイン側では素直に
- 拡張子は一番最後に発見されたドット(.)を起点とする
- 複数拡張子があるときのみ、サニタイズされたファイル名を修正する(_. を . に変更する)
で対応しました(バージョン 2.4.0)。
ところで、いつのまにか有効インストール数が 2万を超えてるんですね。
最初は勉強会のハンズオン題材にーということで準備、その後プラグイン公開までを目指していたので公開し、ついでだからと仕事で必要だったこともあり使い始めたのが 2013年。途中マルチサイトに対応してくれー(対応した)とか、WordPress 4.7.2からうまくアップロードできなくなった(WordPress 4.7.1からデータ内をチェックしてMIME判定するようになり、誤検出とか出てきた。対応した。)とか、いくつかのリクエストを経ましたがもう 6年経ったのですね。シンプルなのですが、割と使っていて今後も対応していければーと思っています。
2019年7月27日 @kimipooh
0 件のコメント:
コメントを投稿