5

私は自分のウェブサイトのログインシステムを書きました。ユーザーが登録すると、システムは、ユーザーが提供した電子メール アドレスへのアクティベーション リンクを電子メールで送信します。リンクには、email と key の 2 つのパラメーターが含まれています。電子メール パラメータにはユーザーの電子メール アドレスが含まれ、キー パラメータには登録コードが含まれているため、登録を確認して保留中から確認済みに変更できます。有効化ページは、Email 列に設定された email パラメーターを持つ行から Status 列を取得することになっています。何らかの理由で、スクリプトはすべてのリンクが有効であると判断し、存在するかどうかにかかわらず、アカウントのステータスを更新しようとします。

これが私のコードです:

<?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     
4

3 に答える 3

4

コードを次のように変更してみてください:

$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();
}
?>
于 2010-11-27T01:47:20.663 に答える
4

確認済みかどうかを確認するために、ステータスを選択していることに気付きました..

あなたのステータスフィールドは、確認済み/未確認が正しく保存されている場所ですか?

キーをチェックするべきではありませんか?

つまり、代わりに:

$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ます。これは、$_GET リクエスト、電子メール、およびキーでチェックしているものであるためです。電子メールとステータスではありません。

于 2010-11-27T01:23:23.777 に答える
0

最初に気付くのは、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$ exitquery1 を定義した直後に、

print $query1;

ページを再試行すると、mysql に何を渡しているかを確認するのに役立ちます。

アップデート:

最近の入力を読んで、これがうまくいくと思います:

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;
}
于 2010-11-27T01:21:53.980 に答える