====================================================== 103:一時的な作業ファイルには絶対に競合しない名前を使う ====================================================== .. maigo:: 作業用一時ファイルが競合 * 後輩W:ユーザーから、領収書をダウンロードしたら別の人の内容のPDFがダウンロードされた、って連絡がありました。 * 先輩T:えっ、それって大事故じゃない……? 急いで調べよう。 * -30分後- * 後輩W:うーん、わからない。一時保存している作業用ファイルが競合してるのかと思ったけど、ちゃんとファイル名に日時を付けてるから大丈夫みたいだし……。 * 先輩T:ん、日時?  ``receipt-20191121-133815.pdf`` ってこと? それだと1秒差以内の場合に競合するんじゃない? * 後輩W:あっ。 具体的な失敗 ============== この問題は、一時的なファイルが競合する可能性のある名前(例 ``receipt-20191121-133815.pdf`` )で作成されているために発生します。 競合しないようにファイルの命名規則を年月日時分秒で組み立てていますが、秒レベルでの競合は考慮されていませんし、ミリ秒まで指定しても確実とは言えません。 こういった場合、複数のユーザーの操作で1つの同じ作業ファイルに上書き保存されてしまいます。 その結果、領収書ファイルをダウンロードしてみたら知らない人の領収書だった、という漏洩問題が発生します。 ベストプラクティス ======================= .. index:: tempfile 一時的な作業ファイルには絶対に競合しない名前を使いましょう。 Pythonであれば ``tempfile`` モジュールを使ってください。 .. omission:: 関連 ========= * :doc:`101-ファイルを格納するディレクトリを分散させる` * :doc:`102-一時的な作業ファイルは一時ファイル置き場に作成する`