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

目前,当用户登录时,我创建了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-script


http://net.tutsplus.com/tutorials/php/secure-your-forms-with-form-keys/


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


慕的地6264312
浏览 641回答 3
3回答

侃侃尔雅

术语用户:访客。客户端:安装在特定计算机上的特定于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 loadif($_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 loadif($_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 loadif(($_SESSION['count'] -= 1) == 0) {    session_regenerate_id();    $_SESSION['count'] = 5;}您可以根据需要组合所有这些策略,但同时也要组合不利因素。不幸的是,没有解决方案是万无一失的。如果您session_id受到侵害,那么您就已经做好了。以上策略只是权宜之计。

心有法竹

这是荒唐的。当(通常通过跨站点脚本攻击)某人拦截您的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(有时甚至在错误的网络上)从此处发出,他将丢失自己的电话会议左,右,中。

森林海

为了防止会话固定,这基本上是猜测SID或使用各种方法窃取它。无论您的会话逻辑多么复杂,从某种程度上来说,它肯定都会很容易被无聊的sessid窃取。因此,每次执行重要操作时都必须重新生成ID。例如,如果您要在管理员中发布信息或更改设置,请首先运行session-regenerate-id。然后,黑客必须经历再次对您进行黑客攻击的过程。基本上,这使黑客可以一次浪费一次ID的机会。http://us.php.net/manual/zh/function.session-regenerate-id.php或者您可以每隔一圈更改IDif($ _ SESSION ['counter'] == 3){session_regenerate_id(); $ _ SESSION ['counter'] == 0}另外,$ _SERVER ['HTTP_USER_AGENT']也不是很可靠。尝试避免这种情况不仅是因为这个原因,还因为它对黑客很方便,因为他们知道代理广泛用于此目的。而是尝试使用$ _SESSION ['id_token'] = sha1(一些疯狂的信息,例如文件内存,文件名,时间)。
打开App,查看更多内容
随时随地看视频慕课网APP