0

ユーザーがサイトのパスワードを忘れました。ユーザー名を入力すると、リセット ページの URL にトークンが追加されたリンクを含む電子メールが送信されます。リンクがクリックされると、トークンの存在と有効期限が検証されます。正常な場合は、パスワードのリセット フォームが表示され、それ以外の場合はエラー メッセージが表示され、再試行します。ここまでで大丈夫です。ユーザーが新しいパスワードを入力して [送信] をクリックすると、URL の追加部分が消え、通常のページの URL だけがアドレス バーに表示されます。パスワードのリセットフォームは空白のままです。$_GET を使用してトークンを取得し、$_POST を使用してフォームを処理するので、これは私の問題でしょうか? ここにページコードを含めます:

<?php
require_once ('functions.inc.php');
include("header.php");
require_once ('config.inc.php');
?>
<body> 
<div data-role="page" id="resetpassword">
    <div data-role="header">
        <h1>Reset Password</h1>
    </div>
    <div data-role="content">
<?php
$page_title = 'ResetPassword';
if ($_SERVER['REQUEST_METHOD'] == 'GET') { 
$tk = ($_GET['token']);
$q1 = "SELECT uname, request_time FROM users WHERE token = '$tk'";
    $r1 = mysqli_query($dbconn,$q1)or die("Error: ".mysqli_error($dbconn));
    $row = mysqli_fetch_array($r1); 
    $user = $row['uname'];
    $then = $row['request_time'];
    //echo $then;
    $now = time();
    //echo $now;
    $expired = ($now - $then);
    //echo $expired;
    $num_rows = mysqli_num_rows($r1);       
    if ($num_rows !== 1 || $expired > 900){
    echo "An error has prevented a password change.<br />Most likely the link has       expired.<br />Please try again.";   
    ?>
    </div>
    <div data-role="footer" class="ui-bar">
    <a href="../index.php" data-role="button">Try Again</a> 
    </div><!-- /footer -->
    </div>
    <?php
    exit();
}           
        if ($_SERVER['REQUEST_METHOD'] == 'POST') {         
        $trimmed = array_map('trim', $_POST);
        if (preg_match ('/^[[:alnum:]]{8,20}$/', ($trimmed['password']))) {
            $p = mysqli_real_escape_string($dbconn, ($trimmed['password']));
            // hash the password
            require ("passhash.php");
            $pass_hash = PassHash::hash($p);
            } else {
            echo '<p>Please enter a valid password!</p>';
            }
            if ($pass_hash) {
            $q2 = "UPDATE `users` SET upass='$pass_hash' WHERE uname='$user'";
            $r2 = mysqli_query($dbconn, $q2)or die("Error: ".mysqli_error($dbconn));
            if ($r2 == TRUE) {
            echo "<p>Password Changed!</p>";
            }
            }               
?>
</div><!-- /content -->
    <div data-role="footer" class="ui-bar">
<a href="../index.php" data-role="button">Login</a> 
    </div><!-- /footer -->
</div><!-- /page -->
<?php
}
}
?>
<form id="passwordreset" method="post" action="<?php echo $_SERVER['PHP_SELF'];?>?token=<?php echo $tk;?>" data-ajax="false"> 
<p>Choose a new password.<br />
Letters and numbers only.<br />
Minimum of 8 Maximum of 20 characters.</p>
<label for="password" class="ui-hidden-accessible">New Password:</label> 
<input type="password" name="password" id="password" value="" placeholder="New Password"/>
<button type="submit" name="submit" value="submit"/>Submit</button>  
</form>
</div><!-- /content -->
    <div data-role="footer" class="ui-bar">
    </div><!-- /footer -->
</div><!-- /page -->
</body>
</html>             
4

1 に答える 1

0

ここに記載されているように、POST と GET の両方を使用しても問題は発生しません: GET メソッドと POST メソッドの両方を使用したい

ただし、フォームがデータを送信するときは、POST URL にも GET パラメータ (トークン) を含める必要があります。したがって、投稿の URL を変更して、必要なデータ全体を送信してください。

于 2012-07-28T12:11:20.567 に答える