Kurabiye ile Otomatik giriş

2 Cevap php

Ben şimdi 2 gece için oturum açma komut için bir otomatik oturum açma özelliğini yapmaya çalışıyorum.

Ben MD5 ile karma kullanıcıların IP adresini saklamak hangi session_key varchar (255) olarak adlandırılan benim kullanıcıların tablodaki bir alan var.

Çerez ayarlandığında eğer bir formu çıkacak olursa, oturum değişkenleri ayarlanır ve olacaktır.

Onlar giriş ve onlar adında bir onay kutusunu kontrol varsa autologin depolamak zaman kendi MD5 alanında IP adresi karma session_key.

Onların tarayıcıyı kapatmak ve geri gelmek Şimdi, eğer ben onların çerez veritabanında session_key eşit olduğunu kontrol edin.



This is the messy code! I didn't think it would be this hard to implement an auto-login function...

session_start();

// see if the auto-login cookie exists, if so set sessions vars
if (isset($_COOKIE['autologin'])) {
$user=mysql_query("select * from users where session_key = $_COOKIE[autologin]");
$row3=mysql_fetch_assoc($user);



        if ($_COOKIE['autologin'] == $row3['session_key']) {

           $_SESSION['id'] = $row3['id'];
           header("Location: login.php");
        }
    }


// User pressed "Login"
if (count($_POST)) {

$result = mysql_query("SELECT id FROM users 
                       WHERE username = '".mysql_real_escape_string($_POST['username'])."' 
                       AND password = '".mysql_real_escape_string($_POST['password'])."' ");


if (mysql_num_rows($result) == 0) {
        $error = '<script>alert("Wrong username and/or password.\nTry again.")    </script>';
} else {
    $_SESSION['id'] = mysql_result($result, 0, 'id');
    header("Location: login.php");
    mysql_query("UPDATE users SET session_key = '".md5($_SERVER['REMOTE_ADDR'])."'");
    setcookie("autologin", md5($_SERVER['REMOTE_ADDR']), time()+3600);
}

}



if (isset($_SESSION['id'])) {

exit('You are logged in!');

}



<form method="post">

<tr>
<td valign="top" width="95px"><b>Username:</b></td>
<td><input type="text" name="username" size="22" /></td>
</tr>

<tr>
<td valign="top"><b>Password:</b></td>
<td><input type="password" name="password" size="22" /></td>
</tr>

<tr>
<td valign="top"><b>Auto-login:</b></td>
<td><input type="checkbox" name="autologin" /></td>
</tr>

<tr>
<td>&nbsp;</td>
<td><input type="submit" value="Login" /></td>
</tr>

</form>

Bu bile güvenli midir? Çerezleri işlemek için kolay mı?

Afaik youtube sporları bu işlevi - Bunu nasıl yaparsınız?

Ben, işe bu alınamıyor birisi bana yardımcı olabilir?

2 Cevap

İlk olarak, şimdiye kadar ilk önce kaçan olmadan SQL içine kullanıcı (bu çerezler dahil) dizeleri sopa yok.

İkincisi, oturum anahtarlarının benzersiz ve tahmin etmek zor olması gerekir. Birinin oturumu çalmak için yapmanız gereken tüm IP adresini bilmek gibi görünüyor. Daha kötüsü, (Ben onlar aynı binada yaşıyorum çok sık olduğu) de onlarla aynı IP alarak kazayla kendi oturumunu çalabilir.

Üçüncü olarak, girinti kıvırcık parantez uymuyor, bu yüzden neler olduğunu anlamaya zor.

Zaten onlar maç SQL kontrol beri dördüncü, bu "if ($_COOKIE['autologin'] == $row3['session_key'])", gereksiz olduğunu.

Beşinci olarak, sizin 5. satırda, size (çıkmamış) değer etrafında tırnak işaretleri yok, bu yüzden kod yürütme bu noktaya kadar kazanılmış olsaydı, bir SQL sözdizimi hatası almalısınız.

Ben size bir seferde tek test kodunun çok daha basit daha küçük parçalar yapmak öneririz. Örneğin, bir çerez ayarı ve değeri yoluyla geldiğini test ile başlar. Sonra bu çalışma almak, sadece daha sonra bir veritabanı kaydı çerez maçlar olmadığını denetlemek için bazı kod eklemek. Ve sen sql koymak her şeyi kodlamak için emin olun, böylece birisi kendi çerez setleri ise "; açılan veritabanı xxx" veya ne olursa olsun, vidalı değil.

Öncelikle:

    // User pressed "Login"
if (count($_POST)) {

$result = mysql_query("SELECT id FROM users 
                       WHERE username = '".mysql_real_escape_string($_POST['username'])."' 
                       AND password = '".mysql_real_escape_string($_POST['password'])."' ");


if (mysql_num_rows($result) == 0) {
            $error = '<script>alert("Wrong username and/or password.\nTry again.")    </script>';
} else {
    $_SESSION['id'] = mysql_result($result, 0, 'id');
        header("Location: login.php");
        mysql_query("UPDATE users SET session_key = '".md5($_SERVER['REMOTE_ADDR'])."'");
        setcookie("autologin", md5($_SERVER['REMOTE_ADDR']), time()+3600);
}

}

Yazdığınız son bölümünde:

header("Location: login.php");

You are updating database and setting cookie, after you are redirecting the user by header function. So your code never updates and set that cookie. Change it to:

 // User pressed "Login"
if (count($_POST)) {

$result = mysql_query("SELECT id FROM users 
                       WHERE username = '".mysql_real_escape_string($_POST['username'])."' 
                       AND password = '".mysql_real_escape_string($_POST['password'])."' ");


if (mysql_num_rows($result) == 0) {
            $error = '<script>alert("Wrong username and/or password.\nTry again.")    </script>';
} else {
    $_SESSION['id'] = mysql_result($result, 0, 'id');
        mysql_query("UPDATE users SET session_key = '".md5($_SERVER['REMOTE_ADDR'])."'");
        setcookie("autologin", md5($_SERVER['REMOTE_ADDR']), time()+3600);
        header("Location: login.php");

}

}