Итак, я работаю над веб-сайтом, на котором мы хотим, чтобы пользователи подписывались на частную бета-версию. Когда пользователь нажимает «Отправить» на странице регистрации, php-код помещает его имя, адрес электронной почты и случайно сгенерированный хэш из 32 символов в таблицу в моей базе данных. Затем он отправляет пользователю электронное письмо, содержащее ссылку для подтверждения, которая включает адрес электронной почты пользователя и хэш для максимальной безопасности. Это выглядит так:
domain.com/b/[email protected]&hash=1a2a3a4a5a6a7a8a9a8a7a6a5a4a3a2a
Когда они нажимают на эту ссылку, они отправляются на страницу verify.php, которая берет адрес электронной почты и хэш из URL-адреса и проверяет совпадение в ранее упомянутой базе данных. Если есть совпадение, генерируется другое сообщение. Если совпадений нет, пишет "неверный URL или вы не зарегистрировались". Кроме того, таблица базы данных содержит столбец с именем «активный», для которого по умолчанию установлено значение 0, но оно изменяется на 1 при нажатии на ссылку. Код verify.php проверяет, чтобы убедиться, что для параметра active установлено значение 0, прежде чем отображать сообщение о совпадении, чтобы ссылку можно было использовать только один раз.
Сообщение, отображаемое при совпадении, дает им ссылку на мою страницу регистрации phpbb3, которая была изменена. Ссылка выглядит так:
domain.com/phpbb/ucp.php?mode=register&[email protected]&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.
Все это работает по большей части: страница перенаправляется правильно, если не указан адрес электронной почты или хеш, или если он неверен. Единственная проблема заключается в том, что когда пользователь нажимает кнопку «Я согласен» на странице регистрационного соглашения, по какой-то причине вступает в действие перенаправление. Они не переходят на следующую страницу, где существует регистрационная форма.
Это также произошло, когда я попытался пропустить страницу соглашения о регистрации. Он успешно пропустил его, но после того, как я заполнил регистрационную форму и нажал «Отправить», он снова активировал мою функцию перенаправления.
Кто-нибудь знает, почему перенаправление происходит каждый раз, когда нажимается кнопка отправки?