Проблемы с активацией учетной записи PHP - PullRequest
5 голосов
/ 27 ноября 2010

Я написал систему входа в систему для моего сайта.Когда пользователь регистрируется, система отправляет ссылку активации на адрес электронной почты, предоставленный пользователем.Ссылка содержит два параметра, адрес электронной почты и ключ.Параметр электронной почты имеет адрес электронной почты пользователя, а параметр ключа имеет регистрационный код, так что регистрация может быть проверена и изменена с ожидающей на подтвержденную.Страница активации должна извлекать столбец «Состояние» из строки, для которой в столбце «Электронная почта» задан параметр электронной почты.По какой-то причине скрипт решает, что любая ссылка является действительной, и пытается обновить статус учетной записи, независимо от того, существует она или нет.

Вот мой код:

<?php

$email = $_GET['email'];
if($email == "") {
  header("Location: http://www.zbrowntechnology.info/yard/register.php?message=Invalid Activation Link!");
  exit;
}
$key = $_GET['key'];
if($key == "") {
  header("Location: http://www.zbrowntechnology.info/yard/register.php?message=Invalid Activation Link!");
  exit;
}

$con = mysql_connect("HOST", "USER", "PASS") or die(mysql_error());
mysql_select_db("zach_yardad", $con) or die(mysql_error());
$query1 = "SELECT `Status` FROM Accounts WHERE `Email`='".mysql_real_escape_string($email)."' AND `Status`='".mysql_real_escape_string($key)."'";
$result1 = mysql_query($query1) or die(mysql_error());
if(mysql_num_rows($result1) <= 0) {
  header("Location: http://www.zbrowntechnology.info/yard/register.php?message=Invalid Activation Link!");
 exit;
} else {
  $query = "UPDATE Accounts SET `Status`='Confirmed' WHERE `Email`='$email'";
  mysql_query($query) or die(mysql_error());
  header("Location: http://www.zbrowntechnology.info/yard/login.php?message=Registration Complete!");
  exit;
}

?>

Вот действительная ссылка для активации:

http://www.zbrowntechnology.info/yard/activate.php?email=zach@zbrowntechnology.com&key=2772190956485245

Он активирует эту учетную запись, перейдя по ссылке, но после активации перенаправит на страницу входа в систему, если ссылка недействительна.


РЕДАКТИРОВАТЬ:

Вот результат запроса DESCRIBE `Accounts`:

First Name  varchar(65) NO      NULL     
Last Name   varchar(65) NO      NULL     
Email   varchar(100)    NO      NULL     
Username    varchar(65) NO      NULL     
Password    varchar(65) NO      NULL     
Status  varchar(65) NO      NULL     

Ответы [ 3 ]

4 голосов
/ 27 ноября 2010

Я заметил, что вы выбираете статус, чтобы проверить, подтвержден ли он или нет ..

В вашем поле «Статус» хранится подтвержденное / неподтвержденное значение?

Разве вы не должны?проверять ключ?

Другими словами, вместо:

$query1 = "SELECT `Status` FROM Accounts WHERE `Email`='".mysql_real_escape_string($email)."' AND `Status`='".mysql_real_escape_string($key)."'";

Использование:

$query1 = "SELECT `Status` FROM Accounts WHERE `Email`='".mysql_real_escape_string($email)."' AND `Key`='".mysql_real_escape_string($key)."'";

Замена Key именем поля, которое вы хранитеKEY in .. поскольку это то, что вы проверяете с помощью запроса $ _GET, электронной почты и ключа .. не электронной почты и статуса.

4 голосов
/ 27 ноября 2010

Можете ли вы попробовать изменить свой код на это:

$query1 = mysql_query("SELECT `Status` FROM `Accounts` WHERE `Email`='".mysql_real_escape_string($email)."' AND `Status`='".mysql_real_escape_string($key)."'");
 if(mysql_num_rows($query1) <= 0) {

Это должно работать ..

Если это не сработает, попробуйте это:

$query1 = mysql_query("SELECT `Status` FROM `Accounts` WHERE `Email`='".mysql_real_escape_string($email)."' AND `Status`='".mysql_real_escape_string($key)."'", $con);
     if(mysql_num_rows($query1) <= 0) {

==== Полный код ====

<?php
if($_GET['email'] == "") {
header("Location: http://www.zbrowntechnology.info/yard/register.php?message=Invalid Activation Link!");
exit;
}

if($_GET['key'] == "") {
header("Location: http://www.zbrowntechnology.info/yard/register.php?message=Invalid Activation Link!");
exit;
}

$email = mysql_real_escape_string($_GET['email']);
$key = mysql_real_escape_string($_GET['key']);

$con = mysql_connect('HOST', 'USER', 'PASS');
mysql_select_db('zach_yardad', $con) or die(mysql_error());

$query1 = mysql_query("SELECT `Status` FROM `Accounts` WHERE `Email` = '" . $email . "' AND `Status` = '" . $key ."'", $con);
if(mysql_num_rows($query1) <= 0) {
header("Location: http://www.zbrowntechnology.info/yard/register.php?message=Invalid Activation Link!");
exit();
} else {
mysql_query("UPDATE `Accounts` SET `Status`='Confirmed' WHERE `Email`='$email'", $con);
header("Location: http://www.zbrowntechnology.info/yard/login.php?message=Registration Complete!");
exit();
}
?>
0 голосов
/ 27 ноября 2010

Первое, что я заметил, это то, что в вашем запросе mysql вы используете столбец status в качестве поля where.

$query1 = "SELECT `Status` FROM Accounts WHERE `Email`='".mysql_real_escape_string($email)."' AND `Status`='".mysql_real_escape_string($key)."'";

Исходя из того, как вы написали свой код, кажется, что оно должно быть:

$query1 = "SELECT `Status` FROM Accounts WHERE `Email`='".mysql_real_escape_string($email)."' AND `Key`='".mysql_real_escape_string($key)."'";

Для отладки кода, как насчет того, чтобы вы закомментировали команды header и exit, а затем сразу после определения $ query1 выполните

print $query1;

Повторите попытку страницы, и это поможет вам увидеть, что вы передаете в MySQL.

UPDATE:

Читая ваш недавний вклад, я думаю, что это может сработать для вас:

if(mysql_num_rows($result1) > 0) {
  $query = "UPDATE Accounts SET `Status`='Confirmed' WHERE `Email`='$email'";
  mysql_query($query) or die(mysql_error());
  header("Location: http://www.zbrowntechnology.info/yard/login.php?message=Registration Complete!");
  exit;

} else {
  header("Location: http://www.zbrowntechnology.info/yard/register.php?message=Invalid Activation Link!");
 exit;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...