Python3.3未満では、str、bytes、datetime型の「ある値」を含むdict
を作ると計算がものすごーーーーく大変でCPUに莫大な負荷をかける場合があって、第三者が悪用するとサービスを停止させることができます。
これを防ぐには、 python
コマンドに-R
オプションを付けるか、環境変数PYTHONHASHSEED="random"
を指定する必要があります。1
1. コマンドラインと環境 — Python 3.3.6 ドキュメントの-R
オプションの説明にはこう書かれています。
以前のバージョンの Python では、このオプションはハッシュのランダム化を有効にします。これにより、 str, bytes, datetime 型の __hash__() 値が予測不可能な乱数で “salt” 化されます。ハッシュ値は各 Python プロセスでは固定ですが、 Python を繰り返し再実行した場合は別の予測不能な値になります。
ハッシュのランダム化は、 dict の生成コストが最悪の O(n^2) になるように注意深く選ばれた入力値を与えることによる DoS 攻撃への防御策として提供されています。詳細は http://www.ocert.org/advisories/ocert-2011-003.html を参照してください。
Python3.3以上ではデフォルトでハッシュのランダム化をやってくれますが、互換性のために上記オプションは残っています。
たぶん、まだPython2系を使っている人は多いと思いますので、ご注意ください。
-
"random"は「ランダムな文字列を入れる」という意味ではなくて、書いてある通り"random"と設定するという意味です。 ↩