0

我是 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 小时重复一次。我不能再这样做了,因为其他人将在我不知道代码或访问该站点的情况下开始使用此登录名。

编辑:当我刚才将其更改为较晚时,它可以被验证,但仅限于它创建的网站部分(可能有点明显)。

我希望我已经为您提供了足够的信息,并且感谢您愿意为我提供的与此问题相关的任何帮助,因为我确信即使是我提供的少量代码也会显示我的新手状态。无论如何,非常感谢您抽出宝贵的时间。

4

2 回答 2

1

你真的在使用 PHP 会话吗?你已经接到了session_register()电话(顺便说一句,这些电话已被弃用,应该避免),但我在session_start()任何地方都看不到。

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

请改用常规 PHP 会话。

于 2011-05-16T21:26:50.830 回答
0

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

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

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

于 2011-05-16T21:26:03.950 回答