0

我听说人们可以编辑 cookie 并更改他们的名称和访问级别(等等),所以我编写了一个简单的 PHP 代码来防止他们编辑用户的属性(例如访问级别)。这里是:

doConnect();

$currentIP = $_SERVER['REMOTE_ADDR'];

$page = "geton";

$AHQuery = mysql_query("SELECT * FROM users WHERE user='{$_SESSION['uName']}' ORDER BY id DESC");

while($AHLine = mysql_fetch_array($AHQuery)) {

    $trueIP    = $AHLine['ip'];
    $trueLevel = $AHLine['acesslevel'];  

}

if($currentIP != $trueIP || $_SESSION['uAcessLevel'] != $trueLevel) {

    echo "<script>alert('Please, login again.'); location.href='{$page}'</script>";
    exit;
}

上面的代码检查会话用户(X USER)是否是一个有效的名字,如果它等于最新的 X USER 的 ip(当你登录时,你的 ip 被收集并保存在用户表中),如果不是,那么会话被破坏,用户被迫再次登录。无论如何,我的问题是:这种方法安全吗,它真的可以防止人们查看私人页面并以其他用户的身份发表评论吗?(这个功能在我的 php forumblog 的每个页面中)有没有更好更安全的方法来做到这一点?

我尽量说清楚,希望大家理解,谢谢关注。

4

3 回答 3

4

您的脚本是安全的,并且还可以防止基本会话劫持尝试。

您应该考虑通过/24掩码进行检查(并且可能添加更多检查、HTTP_USER_AGENT检查、cookie 检查等) - 这也将允许具有动态 IP 的人访问您的站点。

您不需要检查$_SESSION变量是否已被用户修改,因为这是不可能的(除非他们可以访问服务器,并且您没有进行批量分配$_POST或类似的愚蠢操作)

注意:mysql_*函数自PHP 5.5起已弃用。您可以切换到MySQLiPDO

在回复您的评论时,两个用户拥有相同的 IP 并非完全不可能,动态 IP(由于 IPv4 耗尽,在 ISP 提供的路由器中越来越流行)和NAT(也越来越多由于相同的原因而更受欢迎)可能是造成这种情况的两个原因。

我已经竭尽全力为您提供一个示例PDO语句供您使用:

$pdo = new PDO('mysql:dbname=session_test;host=127.0.0.1', 'root', '');

$sth = $pdo->prepare("SELECT * FROM users WHERE username = ? LIMIT 1");
$sth->bindParam(1, $_SESSION['username']);
$sth->execute();

$user = $sth->fetch(PDO::FETCH_OBJ);

if($user->ip !== $_SERVER['REMOTE_ADDR']) {
    exit("Session hijacking attempt found");
}

随着Cloudflare越来越受欢迎,我将提出在Cloudflare 的 IP 之一$_SERVER['CF_CONNECTING_IP']的条件下使用的建议。$_SERVER['REMOTE_IP']

于 2013-08-30T18:07:54.060 回答
0

使用不正确的比较运算符也可能是代码中的漏洞。作为一项规则,我总是建议使用相同的比较运算符而不是等效的比较运算符。(例如,!==代替!====代替==

于 2013-08-30T18:38:56.253 回答
0

您的脚本和逻辑看起来安全可靠。

您仍然需要验证您是否能够使用$_SERVER['REMOTE_ADDR']. 如果您的服务器位于负载均衡器或代理之后,远程添加将是负载均衡器或代理 IP,在这种情况下,脚本将无法完成其预期的工作。

要使此脚本按设计工作,应将环境配置为始终获取正确的 IP 地址。

于 2013-08-30T18:46:49.350 回答