103:一時的な作業ファイルには絶対に競合しない名前を使う

プログラミング迷子: 作業用一時ファイルが競合

  • 後輩W:ユーザーから、領収書をダウンロードしたら別の人の内容のPDFがダウンロードされた、って連絡がありました。

  • 先輩T:えっ、それって大事故じゃない……? 急いで調べよう。

  • -30分後-

  • 後輩W:うーん、わからない。一時保存している作業用ファイルが競合してるのかと思ったけど、ちゃんとファイル名に日時を付けてるから大丈夫みたいだし……。

  • 先輩T:ん、日時?  receipt-20191121-133815.pdf ってこと? それだと1秒差以内の場合に競合するんじゃない?

  • 後輩W:あっ。

具体的な失敗

この問題は、一時的なファイルが競合する可能性のある名前(例 receipt-20191121-133815.pdf )で作成されているために発生します。 競合しないようにファイルの命名規則を年月日時分秒で組み立てていますが、秒レベルでの競合は考慮されていませんし、ミリ秒まで指定しても確実とは言えません。

こういった場合、複数のユーザーの操作で1つの同じ作業ファイルに上書き保存されてしまいます。 その結果、領収書ファイルをダウンロードしてみたら知らない人の領収書だった、という漏洩問題が発生します。

ベストプラクティス

一時的な作業ファイルには絶対に競合しない名前を使いましょう。 Pythonであれば tempfile モジュールを使ってください。

cover

(中略)詳細は書籍 自走プログラマー をご参照ください

関連