私はZendFrameworkを使用して求人広告サイトを作成しています(ポートフォリオの目的で、はい、世界には「さらに別のCraigslistクローン」の余地がないことを知っています)。アカウントを必要とせずに投稿/編集/削除する機能を実装しようとしています。
これを行うには、送信後にNonceを生成し、データベースに保存する必要があるように感じます。次に、次のように、削除のGETリクエストを行うユーザーにリンクをメールで送信します。
http://www.somesite.com/post/delete/?id=123&nonce=2JDXS93JFKS8204HJTHSLDH230945HSLDF
ユーザーのみがこの一意のキーまたはナンスを持っています。送信時に、投稿のIDでデータベースをチェックし、削除する前にナンスが一致することを確認します。
私の問題は、ナンスが実際にどれほど安全かということです。Zend Frameworkを使用すると、次のZend_Form_Element_Hash
ようなハッシュが作成されます。
protected function _generateHash()
{
$this->_hash = md5(
mt_rand(1,1000000)
. $this->getSalt()
. $this->getName()
. mt_rand(1,1000000)
);
$this->setValue($this->_hash);
}
mt_rand()について読んだあるコメント者は、 「この関数のエントロピーは限られています。したがって、ランダムな文字列を作成する場合、文字列の長さに関係なく、約20億の異なる文字列しか生成しません。これは重大なセキュリティになる可能性があります。このような文字列をセッション識別子、パスワードなどに使用している場合に問題が発生します。」
アプリケーションのナンス/トークンの存続期間(ユーザーが投稿の削除を選択するまでに数日または数週間かかる可能性がある)のため、潜在的なハッキングには十分な時間が与えられると思います。
左側と右側のこのビジュアルマッピングピクセルに見られるものmt_rand()
からの大幅なアップグレードであることがわかります。しかし、それで十分ですか?「20億の異なる文字列」がセキュリティの問題になる理由は何ですか?rand()
rand
mt_rand
そして最終的に、ナンス/トークン/ハッシュのエントロピーをどのように増やすことができますか?