当前位置: 首页 > 面试题库 >

用户登录后,我需要在php会话中存储什么?

岑炯
2023-03-14
问题内容

目前,当用户登录时,我创建了2个会话。

$_SESSION['logged_in'] = 1;
$_SESSION['username']  = $username; // user's name

因此,那些需要登录的页面,我只是这样做:

if(isset($_SESSION['logged_id'])){
// Do whatever I want
}

安全漏洞吗?我的意思是,很容易破解我的会话吗?人们如何修改会话?以及如何预防呢?

编辑:

刚刚找到链接,这些方法够好吗?请发表您的意见。我仍然没有得到最好的答案。


问题答案:

术语

  • 用户: 访客。
  • 客户端: 安装在特定计算机上的特定于Web的软件。

了解会议

为了了解如何使会话安全,您必须首先了解会话的工作方式。

让我们看一下这段代码:

session_start();

调用后,PHP将查找名为PHPSESSID(默认情况下)的cookie 。如果找不到,它将创建一个:

PHPSESSID=h8p6eoh3djplmnum2f696e4vq3

如果找到它,它将采用值,PHPSESSID然后加载相应的会话。该值称为session_id

那是客户唯一会知道的。您添加到会话变量中的任何内容都将保留在服务器上,并且永远不会传输到客户端。如果您更改的内容,则该变量不会更改$_SESSION。在您销毁它或超时之前,它始终保持不变。因此,尝试$_SESSION通过散列或其他方式来混淆内容是没有用的,因为客户端从不接收或发送该信息。

然后,在新会话的情况下,您将设置变量:

$_SESSION['user'] = 'someuser';

客户将永远不会看到该信息。

问题

当恶意用户窃取session_id其他用户的安全性时,可能会出现安全问题。如果没有某种检查,他将可以自由地模拟该用户。我们需要找到一种唯一标识客户端(而非用户)的方法。

一种策略(最有效)涉及检查启动会话的客户端的IP是否与使用会话的人的IP相同。

if(logging_in()) {
    $_SESSION['user'] = 'someuser';
    $_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
}

// The Check on subsequent load
if($_SESSION['ip'] != $_SERVER['REMOTE_ADDR']) {
    die('Session MAY have been hijacked');
}

该策略的问题在于,如果客户端使用负载平衡器,或者(在长时间会话中)用户具有动态IP,则会触发错误警报。

另一种策略涉及检查客户端的用户代理:

if(logging_in()) {
    $_SESSION['user'] = 'someuser';
    $_SESSION['agent'] = $_SERVER['HTTP_USER_AGENT'];
}

// The Check on subsequent load
if($_SESSION['agent'] != $_SERVER['HTTP_USER_AGENT']) {
    die('Session MAY have been hijacked');
}

该策略的缺点是,如果客户端升级其浏览器或安装插件(某些插件已添加到用户代理),则用户代理字符串将更改并且将触发错误警报。

另一种策略是session_id每5个请求轮换一次。这样一来,session_id理论上停留的时间就不足以被劫持。

if(logging_in()) {
    $_SESSION['user'] = 'someuser';
    $_SESSION['count'] = 5;
}

// The Check on subsequent load
if(($_SESSION['count'] -= 1) == 0) {
    session_regenerate_id();
    $_SESSION['count'] = 5;
}

您可以根据需要组合所有这些策略,但同时也要组合不利因素。

不幸的是,没有解决方案是万无一失的。如果您session_id受到侵害,那么您就已经做好了。以上策略只是权宜之计。



 类似资料:
  • 我的密码\u散列有问题,当我登录时,我想让用户登录会话,但当我使用密码验证时不工作,回显不返回任何内容。我怎样才能解决这个问题?谢谢这是我的代码: 这个代码完美的工作时,我不使用password_verify。

  • 问题内容: 我刚刚完成了在PHP中创建整个登录和注册systsem的操作,但是我的问题是我还没有使用任何会话。我是PHP的新手,以前从未使用过会话。我想做的是,在用户注册并填写登录表单后,他们仍将停留在同一页面上。因此,其中一部分将是会话已登录,另一部分将是其他(用户未登录,请显示登录表单)。谁能告诉我如何开始? 问题答案: 希望这可以帮助 :) 开始会话,您需要在页面顶部或在调用会话代码之前说出

  • 使用python代码从Goodreads获得书籍的描述,但是我的代码不允许我在开始实际搜索之前登录,我显然需要添加代码来使用我的用户名和pw进行登录,然后执行搜索。 现在发生的是,我首先得到了登录的弹出窗口,然后出现了错误: 请问有人能帮我一下吗?

  • 问题内容: 如果我想使用Web应用程序跟踪与每个客户端的对话状态,那么哪个更好的替代方法是使用Session Bean还是HTTP Session? 使用HTTP会话: 使用会话EJB: 在执行ServletContextListener时注册为Web应用程序侦听器: 在JSP中: 同一JSP正文中的其他地方: 在我看来,它们几乎是相同的,主要区别在于UserState实例是在前者中传输的,而在后

  • 问题内容: 嘿,我试图让我的php网站在同一用户登录其他地方时基本上“注销”(session_destroy())。有没有办法做到这一点?要远程销毁特定会话? 谢谢大家! 问题答案: 使用当然可以。当用户在其他地方登录时,可以在开始新会话进行新登录之前执行以下步骤: 这将破坏服务器端的旧会话,因此,当另一台计算机再次访问您的应用程序时,它将尝试访问一个不存在的会话,并为其创建一个新的会话(在该用户

  • 我想使用谷歌云存储作为图像保护程序。我在权利上加了“诱惑者”。我参考了这一页。https://cloud.google.com/storage/docs/access-control/making-data-public 我可以从登录谷歌的任何帐户访问该图像。但当我从谷歌注销时。我看不到图像。当我点击链接的图片时,它会重定向到谷歌登录页面。 是否可以在不登录的情况下访问图像? ex:https:/