2011-08-02 7 views
1

私はログインできるユーザーがいるウェブベースのシステム(PHP & MySQL)で作業しています。問題はこのすべてが非常に安全でなければならないということです。さて、私はパスワードを保存する方法を読み、暗号化された接続を使用し、他の多くの安全対策が講じられています。ユーザーをセットアップアカウントに安全に招待する方法

私が解決する必要がある最後の問題は、アカウントを設定する管理者(つまり、名前と電子メールアドレスを入力する)がユーザーをアプリケーションに招待しなければならないということです。彼は、生成された電子メールをリンクを含む新しいユーザーに送ることができる必要があります。ユーザがそのリンクをクリックすると、彼はシステムに連れて行き、彼は彼のパスワードを設定しなければならない。この種の電子メールを送信する際のベストプラクティスは何ですか?私は、ページにいるユーザーが実際にリンクをクリックしたユーザーであることを確認するために、特定のユーザーに関する情報からなる何らかのハッシュを使用すべきであることを認識しています。他に何か対策が必要ですか?

ランダムパスワードを自動生成して新しいユーザーに電子メールで送信し、最初のログイン後に変更する方がよいでしょうか?

答えて

1

IMOパスワードを生成するのではなく、別のテーブルまたはユーザーテーブルに格納できるランダムなハッシュのみを使用するのが最適な方法です。テーブルの構造として使用することができ、次のユーザーが追加されるたびに

users: 
userid 
name 
email 
password //any hashing technique you prefer 
isactive //bool always false when user is created 

invites: 
inviteid 
userid 
hash 
reinvitesent //boolean 
senton 

ここで、情報は、ユーザーテーブルに格納され、エントリが招待して生成されます。送信される電子メールにはhttps://yoursite.com/user/activate.php?userid=x&hash=7a657ab435f4543543543543のようなリンクが含まれています。ユーザーIDとハッシュが一致する場合は、ユーザーにパスワードの選択を依頼します。パスワードの変更が成功した場合は、isactiveをtrueに変更します。

isactive値がtrueでない限り、ユーザーアカウントは使用できません。つまり、クエリのタイプは 'SELECT user FROM users WHERE userid = $ userid AND isactive = 1'になります。また、招待状のsenton値を使用して、ユーザーが招待状を承諾していないかどうかを確認することができます.3日後にリン​​クを再度電子メールで送信し、招待を拒否することもできます。それでも3日以内にユーザーからの返信がない場合は、招待状が自動的に削除されます。

+0

リンクのハッシュについては、単純に乱数のmd5またはsha1ハッシュを使用すれば十分でしょうか? –

+0

うん、sha1またはmd5で十分です。使用した後に招待状を削除してください。 – Ravi

1

安全対策として、プログラムによるランダムな素晴らしいパスワードの生成が最適です。ユーザーは適切と見なしながら変更することができますが、アプリのセキュリティ確保にはあなたが貢献しています。

+0

素晴らしいパスワードを生成することは重要ですが、最終的にユーザーに伝える必要があります。そしてユーザーの電子メールにパスワードを送ることは悪い、悪い習慣です。 – drskullster

1

最初の答えと同じですが、DB構造と処理方法が異なります。

Table users: userId, username, password, email, isActive (optional), invitationCount, inviteId. 
Table invites: inviteId, inviteUserId, inviteHash, isValid, inviteProcessTime. 

新規ユーザへのリンクは次のようになります。http://yoursite.com/invite.php?code= {} inviteHash

inviteHashあなたは簡単にユーザIDを使用して、現在の時間またはそれらの組み合わせを使用して生成することができます。

inviteHash = md5(time().$userId); 

ユーザーがリンクをクリックすると、dbからこのハッシュがチェックされます。それが存在し、ステータスがisValid = 1(このリンクは以前はまだ使用されていないことを意味します)。次に、登録ページに進みます。この新しいユーザーは、必要なデータを入力できます。彼らは成功その後、誰も私たちは、あなたが各ユーザーの招待時間を管理し、制限するのに役立ちます何時間これは、テーブルのユーザーに

invitationCountフィールドをactivedた追跡することができ、将来的にこのリンクを使用することはできませんisValid=0inviteProcessTime=CURRENT_TIMESTAMPを更新して新しいアカウントを作成した場合。 users.inviteIdは、登録日と招待者のオーナーを追跡するのに役立ちます。

+0

お返事ありがとうございます。私はこのソリューションを実装すると思いますが、Raviが以前にこのアイデアを投稿して以来、私は彼の答えを受け入れなければなりません。 –

関連する問題