PHP 登录 cookie 在几个小时后无法识别,但仍然存在,即使在删除后也无法替换


PHP login cookie not recognized after a couple hours, but nonetheless remains, and cannot be replaced, even after deleted

我是PHP的新手,但总体上不是编程,这让我难倒了几个星期。

正在一个网站上工作,其中登录名将被其他人开始使用,因此我当时无法使用我的解决方法。

这是设置 cookie 的代码。

ob_start();
...
session_register("myusername");
session_register("mypassword");
$cookiename = "loginsuccess";
$ipforcookie = $_SERVER['REMOTE_ADDR'];
$cookiedata = $myusername._.$ipforcookie;
$cookietime = time()+18000;
setcookie($cookiename, $cookiedata, $cookietime, '/', ".example.com");
...
ob_end_flush();

这是我用来检查cookie是否有效的代码。

if(isset($_COOKIE['loginsuccess'])){
    $arr = explode("_", $_COOKIE['loginsuccess']);
    if(strcmp($arr[1], $_SERVER['REMOTE_ADDR']) == 0){
        require("headerLogged.php");
    }else{
        require("header.php");
    }
}else{
    require("header.php");
}

它检查是否有 cookie,以及 IP 是否匹配,以防有人试图将 cookie 复制到他们的计算机或基本计算机

问题是,我可以登录并且 cookie 在我检查它的任何地方都注册......大约两个小时。然后网站停止接受它,即使在我删除 cookie 后,它也不会创建新的 cookie,除非我将函数调用从......

setcookie($cookiename, $cookiedata, $cookietime, '/', ".example.com");

setcookie($cookiename, $cookiedata, $cookietime, '/');

然后登录和验证再次工作。必要时每 2 小时重复一次。我不能再这样做了,因为其他人将在我不了解代码或访问该网站的情况下开始使用此登录名。

编辑:当我刚刚将其更改为后者时,它可以被验证,但只能在创建它的网站部分进行验证(也许有点明显)。

我希望我已经给了你足够的信息,我感谢你愿意给我的任何帮助,与这个问题有关,因为我确信即使是我提供的少量代码也能揭示我的新手身份。无论如何,非常感谢您的时间。

你真的在使用PHP会话吗?您已经收到了session_register()呼叫(顺便说一下,这些呼叫已弃用,应该避免),但我在任何地方都没有看到session_start()

但是,您的登录系统存在严重缺陷。请记住,Cookie 存储在事物的客户端。简单地将IP地址嵌入到cookie中并不能阻止任何人。他们可以简单地编辑他们身边的cookie以匹配他们的IP地址和繁荣,他们进入你的系统。

请改用常规的 PHP 会话。

首先,session_register() 自 PHP 5.3.0 起已弃用,不应再使用。您应该改用超全局$_SESSION。有关更多信息,请参阅 PHP 手册页。

此外,仅检查cookie是否具有某些价值不足以保护您的网站。在浏览器中伪造cookie相当容易,并且cookie的内容应被视为任何其他用户输入(这意味着您不应该假设它符合您的期望,您甚至不能确定它是否包含下划线)。基于模拟cookie,我永远无法访问您网站上需要登录的任何部分。

Cookie 可能包含一些会话 ID 值,然后会话本身包含有关谁登录的更多信息(user_id,但没有密码)。您还可以使用包含user_id的 cookie 并将其用作额外验证。切勿在 Cookie 或会话中存储任何密码。