0

所以我在一个网站上工作,我们希望用户注册一个私人测试版。当用户在注册页面上单击提交时,一个 php 代码将他们的姓名、电子邮件和随机生成的 32 个字符的哈希值放入我数据库中的一个表中。然后它会向用户发送一封电子邮件,其中包含一个验证链接,其中包括用户的电子邮件地址和哈希值,以实现最终的安全性。它看起来像这样:

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

当他们单击此链接时,它会将他们发送到 verify.php 页面,该页面从 url 获取电子邮件和哈希,并检查前面提到的数据库中的匹配项。如果有匹配,它会生成另一条消息。如果没有匹配,它会显示“无效的 url 或您尚未注册”。此外,数据库表包含一个名为“活动”的列,默认情况下设置为 0,但单击链接时更改为 1。verify.php 代码检查以确保在显示匹配消息之前将 active 设置为 0,以便链接只能使用一次。

匹配时显示的消息为他们提供了指向我的 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 回答