php会话混乱,php会话控制

发布时间:2022-11-23

本文目录一览:

  1. php Session 被替换了
  2. PHP会话验证问题,怎么解决
  3. 我在PHP里用了session_start(),出现了异常
  4. PHP制作网站,不同用户查询的数据会混乱
  5. php的会话,能不能给一个详细地讲解和举列

php Session 被替换了

原因 是 “本机测试” 出现这种情况要满足两个条件:

  1. 测试时A网 B网访问用了同一域名(猜测都是用本机IP、 localhost 、 127.0.0.1三者之一)
  2. A网、B网中记录登录状态的SESSION索引相同,如$_SESSION['V'],即V相同。 在SESSION 是记录在WEB服务器端的,PHP代码中session_start()后,会在客户端产生一个COOKIE值(一般默认为"PHPSESSIONID"),用来表示用户对记录在WEB服务器的SESSION的访问控制权限。 现在分析第一个条件,A网、B网在同一域名,导致A网、B网共用名为"PHPSESSIONID"COOKIE,所以A网B网可以相互控制访问彼此的SESSION,再加上第二个条件,就造成了A网B网记录登录状态的SESSION的互窜 解决方法: 破坏上两者条件之一:
  3. A网用 你的本机IP 访问(如果你不是在局域网的话,可以用域名反解析C:\Windows\System32\drivers\etc\hosts,将 解析到127.0.0.1,以后可以用访问你的A网啦,哈哈),B网用127.0.0.1;
  4. 改A B网SESSION名

PHP会话验证问题,怎么解决

会话控制的思想就是指能够在网站中根据一个会话跟踪用户。这里整理了详细的代码,有需要的小伙伴可以参考下。

概述

http 协议是无状态的,对于每个请求,服务端无法区分用户。PHP 会话控制就是给了用户一把钥匙(一个加密session字符串),同时这也是用户身份的一个证明,服务端存放了这把钥匙能打开的箱子(数据库,内存数据库或者使用文件做的),箱子里面装的就是用户的各个变量信息。

传统的php session 使用

// page1.php 启动一个会话并注册一个变量
session_start();
$_SESSION['user_var'] = "hello,codekissyoung!";
// 这里的可以将$_SESSION理解为用户的箱子,实际的实现是php在服务器端生成的小文件
// page2.php
session_start();
echo $_SESSION['user_var']; // 通过钥匙访问自己的箱子内的变量
$_SESSION['user_var'] = "bey,codekissyoung!";
// page3.php 销毁钥匙,一般在用户注销时,访问page3.php文件
session_start();
session_destroy();

提一个问题,钥匙呢?没看见给用户钥匙的操作啊?
这个操作是php背后帮我们做了的,自从你访问page1.php 程序运行,session_start();这句时,php 会根据此刻的一些条件(用户ip,浏览器号,时间等)生成一个PHPSESSID变量,http response 回客户端后,这个PHPSESSID就已经存在你的浏览器cookie里了,每次你再次访问这个域名时,该PHPSESSID都会发送到服务端。这个PHPSESSID 就是我这里说的用户钥匙了。 再一个问题,这个PHPSESSID的安全性,它是否容易被窃取,是否容易被伪造,是否容易被篡改?
使用 Https 可以防止被篡改。不使用PHPSESSID,而是自己生成一把秘钥给用户可以防止被伪造。至于是否容易被窃取,还真没怎么研究过。比如如果你电脑连着网,黑客入侵你电脑。

将生成的秘钥存入浏览器cookie中

设置cookie:

setCookie('key','value',time()+3600);

删除cookie:

setCookie('key','',time()-1);

实现单点登录:session共享

单点登录:多个子系统之间共用一套用户验证体系,在其中一处登录,就可以访问所有子系统。
试想这么一种情景:假设服务器A与B的php环境一致。用户在 服务器A 上拿到了自己的钥匙,然后他拿着这把钥匙去访问服务器B,请问服务器B认识么?
很显然不能,服务器A生成的钥匙,服务器并不认识。
解决办法:用户无论访问A或B,生成的钥匙我都存储在C(同一个数据库,或缓存系统)中,用户再次访问A或B时,A和B都去问下C:这个用户的钥匙对么?对的话,用户就可以使用自己存在A或者B那里的箱子了。

session_regenerate_id(); // 重置 session 字符
$session_info = array('uid' => $uid, 'session' => session_encrypt(session_id().time()));
// 下一步将,$session_info 存到 C 中

下面是php通过会话控制实现身份验证实例

身份验证应用程序主体:authmain.PHP

// 开启一个会话
session_start();
if((!isset($userid))||(!isset($password))) {
    $userid = $_POST['userid'];
    $password = $_POST['password'];
    // 连接数据库
    $db_conn = new mysqli("localhost", "root", "", "auth");
    if(mysqli_connect_errno()) {
        echo '连接数据库失败:'.mysqli_connect_error();
        exit();
    }
    // 执行SQL查询语句
    $query = "SELECT * FROM authorized_users WHERE name='".$userid."' and password=sha1('".$password."')";
    $result = $db_conn->query($query);
    if($result->num_rows > 0) {
        // 注册一个会话变量
        $_SESSION['valid_user'] = $userid;
    }
    // 断开数据库连接
    $db_conn->close();
}
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>身份验证</title>
</head>
<body>
<h1>主页</h1>
<?php
// 判断用户是否已经登录
if(isset($_SESSION['valid_user'])) {
    echo $_SESSION['valid_user'].',您好,你已经登录';
    echo '<a href="logout.php">退出登录</a><br/>';
} else {
    if(isset($userid)) {
        echo '您没有登录成功';
    } else {
        echo '您还没有登录<br/>';
    }
?>
    <form method="post" action="authmain.php">
        <p>用户名:<input type="text" name="userid"/></p>
        <p>密码:<input type="password" name="password"/></p>
        <p><input type="submit" name="submit" value="登录"/></p>
    </form>
<?php
}
?>
<br/>
<a href="members_only.php">登录进入</a>
</body>
</html>

网站的有效用户检查:members_only.php

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>身份验证</title>
</head>
<body>
<?php
// 启用会话
session_start();
echo '<h1>会员有效</h1>';
if(isset($_SESSION['valid_user'])) {
    echo "<p>".$_SESSION['valid_user'].",您好,您已经登录成功</p>";
    echo '<p>会员可享受折扣优惠</p>';
} else {
    echo '<p>您还没有登录成功</p>';
    echo '<p>只有登录成功才能查看此页</p>';
}
echo '<a href="authmain.php">返回主页</a>';
?>
</body>
</html>

注销会话变量并销毁会话:logout.php

// 启用会话
session_start();
$olduser = $_SESSION['valid_user'];
// 注销会话变量
unset($_SESSION['valid_user']);
// 销毁会话
session_destroy();
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>退出登录</title>
</head>
<body>
<h1>您退出登录了!</h1>
<?php
if(!empty($olduser)) {
    echo '退出登录了<br/>';
} else {
    echo '您没有登录过,所以当然也不存在退出登录<br/>';
}
?>
<a href="authmain.php">返回主页</a>
</body>
</html>

我在PHP里用了session_start(),出现了异常

第一个错误是说在会话初始化之前,调用了session_destroy()
第二个错误是说,在初始化会话之前有页面输出。 所以,应该把 session_start() 放在文件开头,并保证之前没有任何输出,哪怕是一个空格。 这样试试看……

PHP制作网站,不同用户查询的数据会混乱

你这说白了,其实就是前后台的意思吧,你A用户进入的A1就是后台界面,B用户进的B1就是前台用户操作界面。 如果B用户不操作,你A用户查询就会显示A2界面,如果B用户操作,那么A用户刷新就会显示B2界面。 这个当然要用session,首先你要注册两个session变量,
一个是session A1,一个是session B1,这样两个session就可以操作两个用户。 当A1登录系统,检查B1的session是否存在,如果B1的session存在,那么就A2页面自动载入B1的页面数据,至于怎么实时操作,这个不属于当前问题的范畴。 如果B1session不存在即登出,或者未登录,那么检查A1的session,显示A2页面原有的内容即可。

php的会话,能不能给一个详细地讲解和举列

在库鲁克斯岛米诺基亚村附近,看下面的图。 图比较大,不方便把米村也截进来,出米村东门后沿路走到图示地点就可以,图若不清楚请点击放在新窗口中观看。