0

かわいそうなタイトルすみません...

ログインスクリプトの基本的なフォームを作成しようとしています。ユーザーはユーザー名とパスワードを入力し、「ログイン」を押します。フォームに割り当てられたアクションは、同じページを更新することだけです。このページには、$ _ POST内のユーザー名とパスワードをチェックし、存在する場合は資格情報をチェックし、セッションIDを作成し、Cookieを設定するコードが含まれています。ログインが成功すると、ページのログインセクションは表示されなくなります。

私が抱えている問題は、ログインを押した後、そのCookieからの後続の読み取りが失敗するため、Cookieが十分に速く書き込まれないように見えることです。ただし、ページを手動ですぐに更新すると、実際には正常にログインしています。

// Login function, MD5 hashing would be replaced with something better
// if this were something mission critical, but as it stands I'm only
// using this as a learning tool
function login($username, $password) 
{

    $username = addslashes($username);
    $password = md5($password);
    $query = mysql_query("SELECT * FROM users WHERE username='$username' AND password='$password'");

    if(mysql_num_rows($query) == 1) 
    {
        $info = mysql_fetch_array($query);
        $userid = $info[uid];
        $sessionid = md5($userid . time());
        $time = time();
        setcookie ("testcookie", $sessionid, $time+3600, '/', '');
        mysql_query("DELETE FROM sessions WHERE uid='$userid'");
        mysql_query("INSERT INTO sessions (sessionid,uid,timestamp) VALUES('$sessionid','$userid','$time')");
        return $userid;
    } 
    else 
    {
        return 0;
    }
}







// Check the cookie and return the userid

function status() 
    {

        $sessionid = $_COOKIE[nojunkcontest];
        $oldtime = time() - 3600;
        $query = mysql_query("SELECT * FROM sessions WHERE sessionid='$sessionid' AND timestamp>$oldtime");


        if(mysql_num_rows($query) == 1) 
        {
            $info = mysql_fetch_array($query);
            return $info[uid];
        }

        return 0;
    }





// Check whether to attempt login, get userid either way

if($_POST[username] !='' || $_POST[password] != '') 
{
    $login_status = login($_POST[username], $_POST[password]);
} 

else if($_GET[logout]) 
{
    logout();
}

unset($userid); 
$userid = status();





// This is in the body of the document...

<?php
if($userid > 0) 
{ 
echo "Logged in  (<a href='?logout=1'>Logout</a>)"; 
} 

else 
{

if($login_status != '' && $login_status == 0) 
{ 
    echo "Invalid username/password combo.<br>"; 
}

?>

<form action = 'index.php' method ='post'>
<table border = '0' cellspacing = '5'>
<tr>
    <td>Username</td>
    <td><input type = 'text' name = 'username'></td>

    <td>Password</td>
    <td><input type = 'password' name = 'password'></td>

    <td><input type = 'submit' name = 'submit' value = 'Login'></td>
</tr>
</table>
</form>

ご覧のとおり、フォームアクションは「index.php」です。これは、このすべてのコードが存在するのと同じページであるため、更新を実行するだけです。ただし、status()関数はこの更新で0を返しますが、後で手動で更新すると成功するため、失敗しているのは$_COOKIE呼び出しであると思われます。私が含めなかったlogin()関数は、status()が読み取るCookieを書き込みます。だから、すべてがその部門で働いています、それは私が理解できないこの厄介なリフレッシュのことです。

助けていただければ幸いです、ありがとう。

4

1 に答える 1

0

あなたが実験しているだけであり、安全である必要はないと述べたように:

Cookie の問題は、実行後にCookie が設定され、ユーザーへの配信が完了することです。これが、同じスクリプトで Cookie を設定した後、数行で Cookie を読み取ることができない理由です。

しかし、コメントの他の人がすでに示唆しているように、これには決して Cookie を使用せず、セッションを使用してください。

于 2012-05-12T11:00:47.123 に答える