0

だから私はユーザーにプライベートベータにサインアップしてもらいたいウェブサイトに取り組んでいます。ユーザーがサインアップページで[送信]をクリックすると、phpコードにより、名前、電子メール、およびランダムに生成された32文字のハッシュがデータベースのテーブルに配置されます。次に、ユーザーの電子メールアドレスと究極のセキュリティのためのハッシュを含む確認リンクを含む電子メールをユーザーに送信します。次のようになります。

domain.com/b/verify.php?email=sample@sample.com&hash=1a2a3a4a5a6a7a8a9a8a7a6a5a4a3a2a

このリンクをクリックすると、verify.phpページに送信されます。このページでは、URLから電子メールとハッシュを取得し、前述のデータベースで一致するものをチェックします。一致するものがある場合は、別のメッセージが生成されます。一致するものがない場合は、「URLが無効であるか、サインアップしていません」と表示されます。また、データベーステーブルには、「アクティブ」と呼ばれる列が含まれています。この列は、デフォルトでは0に設定されていますが、リンクをクリックすると1に変更されます。verify.phpコードは、一致メッセージを表示する前にactiveが0に設定されていることを確認して、リンクを1回だけ使用できるようにします。

一致したときに表示されるメッセージは、変更された私のphpbb3登録ページへのリンクを提供します。リンクは次のようになります。

domain.com/phpbb/ucp.php?mode=register&email=sample@sample.com&hash=1a2a3a4a5a6a7a8a9a8a7a6a5a4a3a2a

フォーラムのルートディレクトリにあるucp.phpファイルを次のように変更しました。

case 'register':
        // Database info (which I stupidly forgot not to hide prior to this...

        if(isset($_GET['email']) && !empty($_GET['email']) AND isset($_GET['hash']) && !empty($_GET['hash'])){
            // Verify data
            $email = mysql_escape_string($_GET['email']); // Set email variable
            $hash = mysql_escape_string($_GET['hash']); // Set hash variable

            $search = mysql_query("SELECT email, hash FROM users WHERE email='".$email."' AND hash='".$hash."' AND active='1'") or die(mysql_error()); 
            $match  = mysql_num_rows($search);

            if($match > 0){
                // We have a match, activate the account
                mysql_select_db("db2") or die(mysql_error());
                if ($user->data['is_registered'] || isset($_REQUEST['not_agreed']))
                {
                redirect(append_sid("{$phpbb_root_path}index.$phpEx"));
                }

                $module->load('ucp', 'register');
                $module->display($user->lang['REGISTER']);

            }else{
                // No match -> invalid url or account has already been activated.
                mysql_select_db("db2") or die(mysql_error());
                if ($user->data['is_registered'] || isset($_REQUEST['not_agreed']))
                {
                redirect(append_sid("{$phpbb_root_path}index.$phpEx"));
                } else {
                redirectpage();
                }
            }

        }else{
            // No match -> invalid url or account has already been activated.
                redirectpage();
        }
break;

これと同じコードがverify.phpページで使用されていますが、動作するためにactiveを0に設定する必要がないように変更した点が異なります。

このすべてがほとんどの部分で機能します。電子メールまたはハッシュが指定されていない場合、または正しくない場合、ページは適切にリダイレクトされます。唯一の問題は、ユーザーが登録契約ページの[同意する]ボタンをクリックすると、何らかの理由でリダイレクトが機能することです。登録フォームが存在する次のページに移動することはありません。

これは、登録契約ページをスキップしようとしたときにも発生しました。正常にスキップされましたが、登録フォームに入力して[送信]をクリックすると、リダイレクト機能が再度トリガーされました。

送信ボタンが押されたときにリダイレクトが発生する理由を知っている人はいますか?

4

1 に答える 1

0

送信ボタンをクリックするたびに同じページに送信され、モードが「登録」に設定されているため、ページがリダイレクトされていると想像できますが、メールやフォームからのハッシュは追加されません. そのため、送信をクリックして最終ページに移動するときに渡される値に対して、リダイレクトの例外を設定するだけです。

于 2011-07-23T05:07:11.893 に答える