【Java】ファイルアップロード時のファイルチェック

今のシステムで脆弱性診断を行いました。

 

tomcatのバージョンが古いとかクロスサイトスクリプティングとか問題は出たのですが、その中で一つ。

 

【ファイルをアップロードする機能にファイルチェックが無い・・・】

 

それの何が危ういかと言うと、

例えば、画像をアップロードする機能で


<script>

うんたらかんたら

</script>


みたいな悪意のあるスクリプトを埋め込んだファイルの拡張子をpngやimgに変えてアップロードしてサーバに置くことが可能だからです。と。

 

なるほど。

ではチェックしましょう。

 

【なにをするか】

⇒許容するファイル以外はアップロードしない

【どうやるか】

⇒①拡張子で判定

②拡張子とファイルの中身がマッチしているか判定

 

①は簡単、ファイル名から”.以下”を取得して許容するファイルの拡張子かどうか判定

②がちょっと重要、上の例みたいに拡張子を偽装しているファイルの対策

 

どうやろうか、、、と調べていたら、「Content-Type」「MIME-Type」というものを発見。

 

両方似たようなものですね。

コンテントタイプ

Content-Typeとは : JavaA2Z

マイムタイプ

MIMEタイプとは - IT用語辞典
MIMEタイプ【メディアタイプ / Content-Type / コンテンツタイプ】とは、電子メールに文字以外のデータを含める方式を定めたMIMEで、データ形式を識別するためのコードの体系。転じて、Webのデータ送受信を行うHTTPなどでもデータの種類を表すコード(Content-Type)として利用されている。

 

これじゃん、これチェックすればいいじゃん。

と実装。あれ、PDFがアップロード出来ない。。。

デバッグ、、、、Content-Type:application/octet-stream

??

データ形式が不明あるいは任意のバイナリ形式の場合は「application/octet-stream」というタイプが用いられる。

あれ、なんでだ。

 

どうやらContent-Typeはファイルをブラウザが判断し、付与しているらしい。。。

 

なる。なら別アプローチ。

 

ならファイルをJavaでそれぞれのオブジェクトに入れて、オブジェクトが出来たら対象ファイル、出来なかったら(Exceptionになったら)catchしてエラーとする。

 

うん、これ素敵やん。

 

イメージファイル系 ⇒ ImageIO

エクセルファイル  ⇒ Workbook

PDF        ⇒ PDFParser

 

あぁ、これでクリア。。。

 

因みに、拡張子チェックで対象のファイルに絞った後に、そのファイルにあったファイルチェックを行わないとだめよ。

コメント