为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕的地6264312 2019-11-27 12:51:15
目前,当用户登录时,我创建了2个会话。$_SESSION['logged_in'] = 1;$_SESSION['username']  = $username; // user's name因此,那些需要登录的页面,我只是这样做:if(isset($_SESSION['logged_id'])){// Do whatever I want}有安全漏洞吗?我的意思是,很容易破解我的会话吗?人们如何修改会话?以及如何预防呢?编辑:刚发现这个:http://www.xrvel.com/post/353/programming/make-a-secure-session-login-scripthttp://net.tutsplus.com/tutorials/php/secure-your-forms-with-form-keys/刚刚找到链接,这些方法够好吗?请发表您的意见。我仍然没有得到最好的答案。
查看完整描述

3 回答

?
侃侃尔雅

TA贡献1801条经验 获得超15个赞

术语

用户:访客。

客户端:安装在特定计算机上的特定于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受到侵害,那么您就已经做好了。以上策略只是权宜之计。


查看完整回答
反对 回复 2019-11-27
?
心有法竹

TA贡献1866条经验 获得超5个赞

这是荒唐的。


当(通常通过跨站点脚本攻击)某人拦截您的sessionId(这是浏览器自动发送到Web服务器的cookie)时,就会发生会话劫持。


例如,有人发布了此信息:


因此,当用户登录时:


//不是最安全的哈希!$ _SESSION ['checksum'] = md5($ _ SESSION ['username']。$ salt);


在进入敏感区域之前:


if(md5($ _ SESSION ['username']。$ salt)!= $ _SESSION ['checksum']){

handleSessionError(); }


让我们来看看这是怎么回事


盐-没错,但毫无意义。没有人在破解您该死的md5,谁在乎它是否咸

将SESSION变量的md5与SESSION中存储的同一变量的md5进行比较-您正在比较会话之间的会话。如果该东西被劫持,将无济于事。

$_SESSION['logged_in'] = 1;

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

$_SESSION['hash']      = md5($YOUR_SALT.$username.$_SERVER['HTTP_USER_AGENT']);

//对用户名进行散列以避免操作


避免由谁操纵?神奇的会议仙境?除非服务器受到威胁,否则不会修改会话变量。哈希实际上仅是用来将您的字符串很好地压缩为48个字符串(用户代理可能会有点长)。


至少,但是,我们现在正在检查一些客户端数据,而不是检查从SESSION到SESSION数据,他们已经检查了HTTP_USER_AGENT(用于标识浏览器的字符串),这可能足以保护您,但您必须意识到如果此人已经以某种方式获取了您的sessionId,则很可能是您还向恶意者服务器发送了一个请求,并为该恶意者提供了您的用户代理,因此,聪明的黑客会欺骗您的用户代理并破坏此保护。


你真是可悲的是。


一旦您的会话ID遭到破坏,您就走了。您可以检查请求的远程地址,并确保所有请求中的远程地址都相同(就像我所做的一样),并且可以完美地满足您99%的客户群的需求。然后,有一天,您会收到一个用户的呼叫,该用户使用具有负载平衡代理服务器的网络,请求将通过一组不同的IP(有时甚至在错误的网络上)从此处发出,他将丢失自己的电话会议左,右,中。


查看完整回答
反对 回复 2019-11-27
?
森林海

TA贡献2011条经验 获得超2个赞

为了防止会话固定,这基本上是猜测SID或使用各种方法窃取它。无论您的会话逻辑多么复杂,从某种程度上来说,它肯定都会很容易被无聊的sessid窃取。因此,每次执行重要操作时都必须重新生成ID。例如,如果您要在管理员中发布信息或更改设置,请首先运行session-regenerate-id。然后,黑客必须经历再次对您进行黑客攻击的过程。基本上,这使黑客可以一次浪费一次ID的机会。


http://us.php.net/manual/zh/function.session-regenerate-id.php


或者您可以每隔一圈更改ID


if($ _ SESSION ['counter'] == 3){session_regenerate_id(); $ _ SESSION ['counter'] == 0}


另外,$ _SERVER ['HTTP_USER_AGENT']也不是很可靠。尝试避免这种情况不仅是因为这个原因,还因为它对黑客很方便,因为他们知道代理广泛用于此目的。而是尝试使用$ _SESSION ['id_token'] = sha1(一些疯狂的信息,例如文件内存,文件名,时间)。


查看完整回答
反对 回复 2019-11-27
  • 3 回答
  • 0 关注
  • 634 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信