the Security SEの方がより良い質問かもしれませんが、これは尋ねるのに悪い場所ではないと思います。メールでワンタイムパスワードを送信する
私は企業内でオンライン選挙を開催するWebアプリケーションを開発しています。選挙人は、アプリにログインして好きな候補者に投票し、その後アプリを終了することができます。
選挙人すべてのPHPのrandom_bytes()
でPHPのrandom_int()
と完全に予測不可能なパスワード(で(少なくとも4ランダムな整数でかなり予測不可能なユーザ名を割り当てられます。
クライアントはすべての選挙のユーザ名とパスワードを送信したいを(時には最大5,000人の異なる人)が電子メールで私は大ファンではありませんが、それは私のための仕事であり、SSLの上で送信されるので、少なくともそれは何かです。
私は、一度だけ投票しなければならないので、投票が行われた直後にアカウントを無効にすることができます。同じ資格で再度ログインするそれではうまくいきません。また、私は24時間ごとにパスワードを変更し、まだ投票していない選挙人に、更新された資格情報で新しい電子メールを送ることができます。選挙は通常3〜5日間続きますので、更新された電子メールは自動的に票を投じるように通知します。選挙が終了すると、関連するすべてのアカウントも非アクティブになります。
これで十分ですか?私はトークンを使って1回のURIを使用するようにプッシュする記事をたくさん読んだことがありますが、アプリケーション内の作成されたアカウントは一度しかログインできず、その後は非アクティブになります。私の考えでは、ユーザが新しいパスを作成するためのフォームを持つURIは、一度ログインすれば永久にアカウントを忘れるので、ユーザにとって面倒です。
注:生成されたすべてのパスワードは、データベースに格納される前にbcrypt()
を渡します。電子メールは、パスワードが生成された直後に送信されます。実際には、パスワードがプレーンテキストで表示される唯一の時間です(ただし、SSL上では、それは価値があります)。
トークンを使用して一意のURLを送信すると、パスワードを作成するためにフォームが必要なのはなぜですか?あなたが言ったように、彼らは完全なユーザーアカウントに繰り返しログインするのではなく、1回限りのアクションを実行してからロックしたアカウントを実行することが許可されています。 URLをメールで送信して投票したら、URLを期限切れにすることはできませんか?ユーザーIDやランダムなものなどの一意の識別子を使用してURLのトークンを生成し、bcryptなどの強力なハッシングアルゴリズムで実行します。 – BadHorsie
それでもURLにユーザ名とパスワードを送信する必要がありますか?このパッケージはジョブのためにまともに見えません。https://github.com/spatie/laravel-url-signer – Loek
いいえ、あなたはユーザー名やパスワードは必要ありません。一意で安全なハッシュで、ユーザーレコードと共に格納されます。 – BadHorsie