つまり、基本的には、シンプルでありながら安全な、忘れられたパスワードスクリプトを作成しようとしています。
2つのスクリプトがあります。1つはユーザーが自分の電子メールアドレスを入力できるようにするものです。これにより、新しいパスワードを保存するためにアクセスする必要のあるリンクが記載されたメールが送信されます。
2番目のスクリプトは、リンクがつながる場所です。このスクリプトは、新しいパスワードを保存します。
セキュリティ上の理由から、データベース内に「トークン」という新しいテーブルを作成しました。3つのフィールドがあります。トークン、メール、使用済み。トークンはランダムに生成された10文字と数字の文字列であり、電子メールはそのユーザーの電子メールアドレスであり、使用されるのはトークンが使用されたかどうかを示す1または0の整数です。
2つのスクリプトを読むと、私の構造をはるかに理解できるようになります。それらは長くはなく、まったく複雑ではありません。
何が問題になっていますか
さて、問題が発生しているのは1つだけです。これは、reset-password.phpスクリプト内にあります。これは、ユーザーが電子メールを受信した後にアクセスする場所です。基本的に、新しいパスワードを入力して[パスワードのリセット]をクリックしますが、何も起こりません。エラーや確認は表示されず、データベース内で何も変更されていません。私はこれをデバッグできないようで、今何時間も検索して試しています。すべてのヘルプと提案をいただければ幸いです。
私はまだPHPとMySQLの初心者であることを覚えておいてください。PHPを使用して約8週間、MySQLを使用しているのはわずか2週間です。
forgot-password.php
<?php
//Forgotten password script
//Variable to save errors
$errors = array();
$email = $_POST['email'];
include 'config.php';
mysql_connect("$db_host", "$db_username", "$db_password")or die("cannot connect");
mysql_select_db("$db_name")or die("cannot select DB");
$query = "SELECT email FROM users WHERE email='" . $email . "'";
$result = mysql_query($query);
$num = mysql_num_rows($result);
if($num==0)
{
echo ("<div style='color:red;'>Email address is not registered</div>");
die();
}
$token = getRandomString(10);
$query = "INSERT INTO tokens (token,email) VALUES ('".$token."','".$email."')";
mysql_query($query);
//function to renerate the token
function getRandomString($length)
{
$validCharacters = "ABCDEFGHIJKLMNPQRSTUXYVWZ123456789";
$validCharNumber = strlen($validCharacters);
$result = "";
for ($i = 0; $i < $length; $i++)
{
$index = mt_rand(0, $validCharNumber - 1);
$result .= $validCharacters[$index];
}
return $result;
}
//Send the reset link to the user
function mailresetlink($to,$token)
{
$subject = "Password Reset";
$message = '
<html>
<head>
<title>Password Reset</title>
</head>
<body>
<p>Click on the given link to reset your password <a href="http://domain.com/reset-password.php?token='.$token.'">Reset Password</a></p>
</body>
</html>
';
$headers = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type:text/html;charset=iso-8859-1" . "\r\n";
$headers .= 'From: Password Reset <[email protected]>' . "\r\n";
if(mail($to,$subject,$message,$headers))
{
echo "We have sent the password reset link to your email at <strong>".$to."</strong>";
}
}
//If email is posted, send the email
if(isset($_POST['email']))
{
mailresetlink($email,$token);
}
?>
<table align="center" style="padding-bottom:40px;">
<form action="<?php $_SERVER['PHP_SELF']; ?>" method="post">
<tr>
<td>Email Address: </td>
<td><input type="text" name="email" /></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" value="Reset My Password" /></td></tr>
<input type="hidden" name="register" value="TRUE" />
</form>
</table>
reset-password.php
<?php
//Reset password script
$token = $_GET['token'];
$email;
include 'config.php';
mysql_connect("$db_host", "$db_username", "$db_password") or die("cannot connect");
mysql_select_db("$db_name")or die("cannot select DB");
if(!isset($_POST['newpassword']))
{
$query = "SELECT email FROM tokens WHERE token='" . $token . "' AND used = 0";
$result = mysql_query($query);
while($row = mysql_fetch_array($result))
{
$email = $row['email'];
}
if ($email != '')
{
$_SESSION['email'] = $email;
}
else
{
echo "Invalid link or Password already changed";
}
}
$pass = $_POST['newpassword'];
$email = $_SESSION['email'];
//Save new password
if(isset($_POST['newpassword']) && isset($_SESSION['email']))
{
$query = "UPDATE users SET password = SHA('$password') WHERE email='" . $email . "'";
$result = mysql_query($query);
if($result)
{
mysql_query("UPDATE tokens SET used=1 WHERE token='" . $token . "'");
}
echo "Your password has been changed successfully";
if(!$result)
{
echo "An error occurred. Please try the again or contact us at [email protected]";
}
}
?>
<table align="center" style="padding-bottom:40px;">
<form action="<?php $_SERVER['PHP_SELF']; ?>" method="post">
<tr>
<td>New Password:</td>
<td><input type="password" name="newpassword" id="password"/></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" value="Change Password"></td></tr>
<input type="hidden" name="reset" value="TRUE" />
</form>
</table>
さらに情報やコードが必要な場合は、遠慮なくお問い合わせください。
前もって感謝します!
新しいパスワードパラメータを入力した後、リセットページでトークンパラメータをサーバーに渡している場所がどこにも表示されません。あなたは別の隠された<input />
コントロールを持っているべきです、私は期待します。$_SERVER['PHP_SELF']
クエリ文字列パラメータを返しません。それが現在の問題の原因である可能性があります。
具体的には、
<table align="center" style="padding-bottom:40px;">
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<tr>
<td>New Password:</td>
<td><input type="password" name="newpassword" id="password"/></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" value="Change Password"></td></tr>
<input type="hidden" name="reset" value="TRUE" />
</form>
</table>
する必要があります
<table align="center" style="padding-bottom:40px;">
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<tr>
<td>New Password:</td>
<td><input type="password" name="newpassword" id="password"/></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" value="Change Password"></td></tr>
<input type="hidden" name="reset" value="TRUE" />
<input type="hidden" name="token" value="<?php echo $_REQUEST['token']; ?>" />
</form>
</table>
最初はGETになり、2回目はPOSTになるので、必ず$_GET['token']
sをに変更してください$_REQUEST['token']
。
そうは言っても、あなたのはるかに大きな問題は、' or 1=1 or '
私のトークンとして指定することによって、あなたのすべてのセキュリティをバイパスする能力です。または、私は意地悪でいいことをすることができます'; update users set password = SHA('IKnowThisPassword') where username = 'admin'; --
パラメータ化されたSQLであるという話の教訓(PHPでSQLインジェクションを防ぐにはどうすればよいですか?)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加