ファイルアップロードでファイル名が重複したときの挙動

最近djangoでファイルアップロードが絡む処理を実装したとき、同一ファイル名に対する挙動が以前と変わっていることに気づいた。


以前はファイル名が重複したときxxxx_1.txt、xxxx_2.txtといった感じで連番が振られていたが、現在はxxxx_8kkVNQf.txtのようにランダムな文字列が振られるようになっている。


そういえばちょっと前にファイルアップロード関連でセキュリティアップデートがでていたけど、ちゃんと読んでなかったので確認する。


JVNDB-2014-003951 - JVN iPedia - 脆弱性対策情報データベース
Security releases issued | Weblog | Django



攻撃者が同名のファイル名を持つファイルを連続してアップロードし続けることによって、サービス運用妨害されるおそれがある。


つまり同名のファイルを10000回アップロードされたら、次のアップロードでは10000回のループが走り、FileSystemStorageを使ってる場合はそのたびにos.statが呼ばれるってことですね。


カスタムストレージを使って、外部のクラウドサービスにファイルを保存している場合は、外部サービスへのアクセスが10000回走ると。


パッチ


django.utils.crypto import get_random_stringを使って7文字のランダム文字列を作成するように変わったわけですね。

get_random_stringはセッションのキーやcsrf_tokenを作成するのにも使われている。