PHPを使用して、DBに保存してメールの確認に使用できるランダムな確認コードを生成する方法は何ですか?私の人生では、ユーザーのプロファイルから生成できる一意の番号を生成する方法を考えることはできません。そうすれば、関数を使用して、URLに含めるのに十分な数にすることができます( このリンクを参照 )。ユーザーが自分のアカウントを「確認/有効化」するには、リンクをクリックする必要があることを忘れないでください。数字を使用できない場合は、文字と数字の両方を使用しても問題ありません。
そうは言っても、ランダムなコードを生成するために、ユーザー名と「塩」をハッシュ化しようとしました。もっと良い方法が必要だとわかっているので、聞いてみましょう。
$random_hash = md5(uniqid(Rand(), true));
これは、32文字の英数字で一意です。短くしたい場合は、substr()を使用します。
$random_hash = substr(md5(uniqid(Rand(), true)), 16, 16); // 16 characters long
ランダムデータを生成する代替方法には、次のものがあります。
$random_hash = md5(openssl_random_pseudo_bytes(32));
$random_hash = md5(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM));
// New in PHP7
$random_hash = bin2hex(random_bytes(32));
1)データベースにアクティブ化されたフィールドを作成する
2)登録後、メールが送信されます
3)メールに含めるリンクを作成し、一意の識別子を使用する
ようこそユーザー名ご登録ありがとうございます。
アカウントを有効にするには、下のリンクをクリックしてください
domain.com/register.php?uid=100&activate=1
4)有効化されたフィールドをtrueに更新します
(ソース: jackborn.com )
$email_encrypt = urlencode($email);
$special_string = 'maybeyourcompanynamereversed?';
$hash = md5($email_encrypt.$special_string);
Here is the link that is sent to the email that was provided:
http://yourdoman.com/confirm.php?hash='.$hash.'
The actual link will look something like this:
http://yourdomain.com/confirm.php?hash=00413297cc003c03d0f1ffe1cc8445f8
受け入れられた答えは、PHPのuniqid()
のハッシュを使用することを示唆しています。 niqidのドキュメント は、「ランダムまたは予測不可能な文字列」を作成しないことを明示的に警告し、「この関数はセキュリティ目的に使用してはならない」と強調しています。"
確認コードが推測される可能性について懸念がある場合(そしてそれがコードを発行する全体のポイントです)、openssl_random_pseudo_bytes()
などのよりランダムなジェネレーターを使用することをお勧めします。その後、bin2hex()
を使用して、それをニースの英数字に変換できます。以下は、John Condeの答えの出力と同じように見えますが、(おそらく)よりランダムで推測しにくいものです。
// generate a 16 byte random hex string
$random_hash = bin2hex(openssl_random_pseudo_bytes(16))
最新の補遺:Oleg Abrazhaevが指摘しているように、システムが実行時に暗号的に強力なランダム値を実際に生成できることを確認したい場合は、openssl_random_pseudo_bytes
は、boolへの参照を受け入れて、これを報告します。 phpinspectionsea docs :からのコード
$random = openssl_random_pseudo_bytes(32, $isSourceStrong);
if (false === $isSourceStrong || false === $random) {
throw new \RuntimeException('IV generation failed');
}
次に、生成されたランダム値を以前のように使用します。
$random_hash = bin2hex($random)
もう少し堅牢で機能を追加する必要があると判断しました。これが私が思いついたものです。
/**
* Hash Gen
* @author Kyle Coots
* @version 1.0
* Allow you to create a unique hash with a maximum value of 32.
* Hash Gen uses phps substr, md5, uniqid, and Rand to generate a unique
* id or hash and allow you to have some added functionality.
*
* @see subtr()
* @see md5()
* @see uniqid()
* @see Rand()
*
* You can also supply a hash to be prefixed or appened
* to the hash. hash[optional] is by default appened to the hash
* unless the param prefix[optional] is set to prefix[true].
*
* @param start[optional]
* @param end[optional]
* @param hash[optional]
* @param prefix bool[optional]
*
* @return string a unique string max[32] character
*/
function hash_gen($start = null, $end = 0, $hash = FALSE, $prefix = FALSE){
// start IS set NO hash
if( isset($start, $end) && ($hash == FALSE) ){
$md_hash = substr(md5(uniqid(Rand(), true)), $start, $end);
$new_hash = $md_hash;
}else //start IS set WITH hash NOT prefixing
if( isset($start, $end) && ($hash != FALSE) && ($prefix == FALSE) ){
$md_hash = substr(md5(uniqid(Rand(), true)), $start, $end);
$new_hash = $md_hash.$hash;
}else //start NOT set WITH hash NOT prefixing
if( !isset($start, $end) && ($hash != FALSE) && ($prefix == FALSE) ){
$md_hash = md5(uniqid(Rand(), true));
$new_hash = $md_hash.$hash;
}else //start IS set WITH hash IS prefixing
if( isset($start, $end) && ($hash != FALSE) && ($prefix == TRUE) ){
$md_hash = substr(md5(uniqid(Rand(), true)), $start, $end);
$new_hash = $hash.$md_hash;
}else //start NOT set WITH hash IS prefixing
if( !isset($start, $end) && ($hash != FALSE) && ($prefix == TRUE) ){
$md_hash = md5(uniqid(Rand(), true));
$new_hash = $hash.$md_hash;
}else{
$new_hash = md5(uniqid(Rand(), true));
}
return $new_hash;
}