0

これは、送信ボタンが押されたときの 2 つのフォームと 2 つのアクションです。最初のフォームはアカウント名を尋ね、キャプチャ コードが正しいかどうかを確認します。両方に問題がない場合、ユーザーは次のフォームに進み、パスワードを取得できるように 2 つの質問をします。コードは正常に実行されていますが、問題が発生しました。すべてが OK の場合: アカウントが存在し、キャプチャは問題なく、両方の質問に問題はありません。ユーザーが 2 番目のフォームで [送信] ボタンを押すと、最初のアクションの else ステートメントが再び実行されますが、フォームは問題なく継続し、彼はパスワードを電子メールで受け取りました。どんな助けでも感謝します:)

if ('POST' === $_SERVER['REQUEST_METHOD']){
if($_POST['lostpassword']=='account' AND ($_POST["captcha"])&&$_POST["captcha"]!=""&&$_SESSION["code"]==$_POST["captcha"]) {

connectdb($CONFIG['dbdbname'], $CONFIG['dbaddress'], $CONFIG['dbuser'], $CONFIG['dbpass']);

$postusername = $_POST['account'];
$postusername = antiinjection($postusername);

$result = mssql_query (sprintf(SELECT_USER_FULLINFO, $postusername));
$rows=mssql_num_rows($result);

if($rows>0) {
    $rows=mssql_fetch_assoc($result); 
    extract($rows);
    $error = 2;
} else {
    echo "Account doesn't exist.<br>";
    $error = 1;
}       
}
else { 
       echo '<script language="JavaScript">
             alert("Wrong Verification code. Please try again.");
             </script>';
     }
}

フォーム:

<form name='lostpassword' action='index.php?page=lostpassword' method='post'     onsubmit='return checkform1()' autocomplete='off'>
    <table CELLSPACING=0 BORDER=0 CELLPADDING=0 align=CENTER>
        <tr>
            <td width=200>
                Account
            </td>
            <td>
                <div align=right>
                    <input type=text maxlength=14 name=account>
                </div>
            </td>
        </tr>
        <tr>
            <td valign=middle>
                Verification Image  <img src=\"captcha.php\">
            </td>
            <td>
                <div align=right>
                    <input type=text maxlength=4 name=captcha>
                </div>
            </td>
        </tr>

    </table>
    <div align=center>
        <BR>
        <input type=hidden name=lostpassword value='account'>
        <input type=submit name=Login value='   Submit   '>
    </div>
</form>

次のアクション:

if($_POST['lostpassword']=='email' ) {

$error = 3;
$postusername = $_POST['account'];
$postanswer1 = $_POST['answer1'];
$postanswer2 = $_POST['answer2'];
$postusername = antiinjection($postusername);
$postanswer1 = antiinjection($postanswer1);
$postanswer2 = antiinjection($postanswer2);

connectdb($CONFIG['dbdbname'], $CONFIG['dbaddress'], $CONFIG['dbuser'], $CONFIG['dbpass']);

$result = mssql_query (sprintf(SELECT_USER_FULLINFO, $postusername));
$rows=mssql_num_rows($result);

if($rows>0) {
    $rows=mssql_fetch_assoc($result); 
    extract($rows);

    $postanswer1 = encrypt($postanswer1);
    $postanswer2 = encrypt($postanswer2);
    $answer1 = '0x' . substr(bin2hex($answer1), 0, 32);
    $answer2 = '0x' . substr(bin2hex($answer2), 0, 32);

    if($answer1!=$postanswer1) {
        echo "Answer to security question #1 is incorrect.<br>";
        $error = 2;
    }
    if($answer2!=$postanswer2) {
        echo "Answer to security question #2 is incorrect.<br>";
        $error = 2;
    }
} else {
    echo "Account doesn't exist.<br>";
    $error = 1;
}

}

このアクションのフォーム:

<form name='lostpassword' action='index.php?page=lostpassword' method='post'      onsubmit='return checkform2()' autocomplete='off'>
<table CELLSPACING=0 BORDER=0 CELLPADDING=0 align=CENTER>
<tr>
    <td  width=200>
        Security Question #1
    </td>
    <td>
        <div align=right>
            {$quiz1}
        </div>
    </td>
</tr>
<tr>
    <td>
        Security Answer #1
    </td>
    <td>
        <div align=right>
            <input type=text maxlength=32 name=answer1>
        </div>
    </td>
</tr>
<tr>
    <td>
        Security Question #2
    </td>
    <td>
        <div align=right>
            {$quiz2}
        </div>
    </td>
</tr>
<tr>
    <td>
        Security Answer #2
    </td>
    <td>
        <div align=right>
            <input type=text maxlength=32 name=answer2>
        </div>
    </td>
</tr>
</table>
<div align=center>
    <BR>
    <input type=hidden name=lostpassword value='email'>
    <input type=hidden name=account value='{$postusername}'>
    <input type=submit name=Login value='   Submit   '>
</div>
</form>

メールコード:

if($error==3) {

$newpassword = mt_rand(1000000,9999999);
$newpassword = md5($newpassword);
$newpassword = substr($newpassword, 0, 15);
$encnewpassword = encrypt($newpassword);
echo '<br>';

mssql_query(sprintf(UPDATE_PASSWORD, $encnewpassword, $account));

if($CONFIG['email']==0) {
    echo "<strong>Your password has been reseted to...</strong><br>{$newpassword}<br><br>";
} elseif($CONFIG['email']==1) {
    sendemail($CONFIG['emailsmtp'], $CONFIG['emailuser'], $CONFIG['emailpass'], $CONFIG['emailaddress'], $CONFIG['servername'], "Lost Password", $email, $account, $newpassword, $ssn, "<strong>Your password has been reseted and sent to your email.</strong>");
}

}
4

2 に答える 2

0

もちろん、else ステートメントは最初の条件の否定を検証するため、最初の条件の else ステートメントが実行されます。

if ('POST' === $_SERVER['REQUEST_METHOD']){

}
else {

}

そして、ユーザーが 2 番目のフォームを送信すると、明らかに最初の状態に入ります。

たとえば、次のように送信入力ボタンに別の名前の値を追加することで、これを修正できます。

<input type='submit' name='LoginAct1' value='Submit' />
<input type='submit' name='LoginAct2' value='Submit' />

次に、どのフォーム データが送信されたかを確認します。

if ('POST' === $_SERVER['REQUEST_METHOD'] && isset($_POST['LoginAct1']) ){
     //blah blah
}

if ('POST' === $_SERVER['REQUEST_METHOD'] && isset($_POST['LoginAct2']) ){
     //blah blah
}
于 2013-10-28T13:54:26.430 に答える
0

次のように、最初のアクションの「if 条件」を記述する必要があります。

if ('POST' === $_SERVER['REQUEST_METHOD'] && $_POST['lostpassword']=='account'){
    //rest of the code
}

その後、コードは正常に機能します。

于 2013-10-28T14:11:27.863 に答える