Php 使用cookies自动登录

Php 使用cookies自动登录,php,cookies,Php,Cookies,我已经试着为我的登录脚本制作一个自动登录功能两个晚上了 在我的用户表中有一个名为session\u keyvarchar(255)的字段,我在其中存储用MD5散列的用户IP地址 如果设置了cookie,将设置会话变量,如果没有设置,将显示一个表单 当他们登录时,如果他们选中了名为autologin的复选框,它将在字段session\u key中存储他们的MD5哈希IP地址 现在,如果他们关闭浏览器并返回,我会检查他们的cookie是否等于数据库中的会话密钥 这是混乱的代码!我没想到实现自动登录

我已经试着为我的登录脚本制作一个自动登录功能两个晚上了

在我的用户表中有一个名为
session\u key
varchar(255)的字段,我在其中存储用MD5散列的用户IP地址

如果设置了cookie,将设置会话变量,如果没有设置,将显示一个表单

当他们登录时,如果他们选中了名为
autologin
的复选框,它将在字段
session\u key
中存储他们的MD5哈希IP地址

现在,如果他们关闭浏览器并返回,我会检查他们的cookie是否等于数据库中的会话密钥



这是混乱的代码!我没想到实现自动登录功能会这么难

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>
session_start();
//查看自动登录cookie是否存在,如果存在,请设置会话变量
如果(isset($_COOKIE['autologin'])){
$user=mysql\u query(“从用户中选择*,其中session\u key=$\u COOKIE[autologin]”;
$row3=mysql\u fetch\u assoc($user);
如果($\u COOKIE['autologin']==$row3['session\u key'])){
$\会话['id']=$row3['id'];
标题(“Location:login.php”);
}
}
//用户按下“登录”
如果(计数($\邮政)){
$result=mysql\u查询(“从用户中选择id
其中username=“.mysql\u real\u escape\u字符串($\u POST['username'])。”“
密码=“.mysql\u real\u escape\u string($\u POST['password'])。””;
if(mysql_num_rows($result)==0){
$error='警报(“错误的用户名和/或密码。\n请重试。”);
}否则{
$_会话['id']=mysql_结果($result,0,'id');
标题(“Location:login.php”);
mysql_查询(“更新用户设置会话_键=”.md5($\u服务器['REMOTE_ADDR'])。“”);
setcookie(“autologin”,md5($\u SERVER['REMOTE\u ADDR']),time()+3600);
}
}
如果(isset($\u会话['id'])){
退出('您已登录!');
}
用户名:
密码:
自动登录:
这样安全吗?操纵cookies容易吗

好了,youtube有这个功能-他们是怎么做到的

我不能让它工作,有人能帮我吗?

首先:

    // 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);
}

}
在通过标头函数重定向用户之后,您正在更新数据库并设置cookie。所以你的代码永远不会更新和设置cookie。 将其更改为:

 // 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");

}

}
//用户按下“登录”
如果(计数($\邮政)){
$result=mysql\u查询(“从用户中选择id
其中username=“.mysql\u real\u escape\u字符串($\u POST['username'])。”“
密码=“.mysql\u real\u escape\u string($\u POST['password'])。””;
if(mysql_num_rows($result)==0){
$error='警报(“错误的用户名和/或密码。\n请重试。”);
}否则{
$_会话['id']=mysql_结果($result,0,'id');
mysql_查询(“更新用户设置会话_键=”.md5($\u服务器['REMOTE_ADDR'])。“”);
setcookie(“autologin”,md5($\u SERVER['REMOTE\u ADDR']),time()+3600);
标题(“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);
}

}
在通过标头函数重定向用户之后,您正在更新数据库并设置cookie。所以你的代码永远不会更新和设置cookie。 将其更改为:

 // 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");

}

}
//用户按下“登录”
如果(计数($\邮政)){
$result=mysql\u查询(“从用户中选择id
其中username=“.mysql\u real\u escape\u字符串($\u POST['username'])。”“
密码=“.mysql\u real\u escape\u string($\u POST['password'])。””;
if(mysql_num_rows($result)==0){
$error='警报(“错误的用户名和/或密码。\n请重试。”);
}否则{
$_会话['id']=mysql_结果($result,0,'id');
mysql_查询(“更新用户设置会话_键=”.md5($\u服务器['REMOTE_ADDR'])。“”);
setcookie(“autologin”,md5($\u SERVER['REMOTE\u ADDR']),time()+3600);
标题(“Location:login.php”);
}
}

首先,不要在没有先转义的情况下将用户的字符串(包括cookie)粘贴到SQL中

其次,会话密钥必须是唯一的,并且很难猜测。看来我要做的就是盗取别人的会话,知道他们的IP地址。更糟糕的是,我可以通过与他们拥有相同的IP(如果我与他们在同一幢大楼中,这种情况非常常见)而意外地窃取他们的会话

第三,你的缩进和你的花括号不匹配,所以很难弄清楚到底发生了什么

第四,这个
“if($\u COOKIE['autologin']==$row3['session\u key'])”
是多余的,因为您已经在SQL中检查了它们是否匹配

第五,在第五行中,您的(unscaped)值周围没有引号,因此如果您的代码执行到了这一点,您应该会得到一个SQL语法错误


我建议您制作更简单的代码片段,一次测试一个。例如,从设置cookie开始,测试值是否通过。然后,只有在完成该操作后,才添加一些代码来检查数据库记录是否与cookie匹配。并确保将您放入sql中的所有内容进行编码,这样,如果有人将其cookie设置为“drop database xxx”或其他任何形式,您就不会陷入困境。

首先,不要在不首先转义的情况下将用户的字符串(包括cookie)粘贴到sql中

其次,会话密钥必须是唯一的,并且很难猜测。看来我要做的就是盗取别人的会话,知道他们的IP地址。更糟糕的是,我可以通过与他们拥有相同的IP(如果我与他们在同一幢大楼中,这种情况非常常见)而意外地窃取他们的会话

第三,你的缩进和你的花括号不匹配,所以很难弄清楚到底发生了什么

第四,这个
“if($\u COOKIE['autologin']==$row3['session\u key'])”
是多余的,因为您已经在SQL中检查了它们是否匹配

第五,在第五行中,您的(unscaped)值周围没有引号,因此如果您的代码执行到了这一点,您应该会得到一个SQL语法错误

我建议你多做些简单的事