我需要什么,在PHP会话存储在用户登录?(What do I need to store in th

2019-06-17 22:51发布

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

刚刚发现的联系,是这些方法不够好? 请给你的意见。 我还没有得到最好的答案。

Answer 1:

术语

  • 用户:访问者。
  • 客户端:安装在特定机器上的一个特定的Web功能的软件。

了解会议

为了了解如何让你的会话的安全性,您必须首先了解会议是如何工作的。

让我们来看看这一段代码:

session_start();

只要你调用,PHP将寻找一个名为cookie的PHPSESSID (默认)。 如果没有找到,它会创建一个:

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被泄露,你几乎完蛋了。 上述策略只是头痛医头,脚痛医脚。



Answer 2:

这是荒唐的。

当(通常是通过一个跨站脚本攻击)有人截获您的sessionId(这是由浏览器自动发送到Web服务器一个cookie)发生会话劫持。

有人张贴了这个,例如:

因此,当用户登录:

//不是最安全散列! $ _SESSION [ '校验'] = MD5($ _ SESSION [ '用户名'] $盐);

而在进入之前的敏感区域:

如果(MD5($ _ SESSION [ '用户名'。$盐)!= $ _SESSION [ '校验']){
handleSessionError(); }

让我们去通过什么不对这个

  1. 盐 - 没有错,但毫无意义。 没有人是破解你那该死的MD5,谁在乎它是否盐腌
  2. 会话变量的MD5存储在会话中的同一个变量的MD5比较 - 你比较会话间。 如果事情被劫持,这将无能为力。
 $_SESSION['logged_in'] = 1; $_SESSION['username'] = $username; // user's name $_SESSION['hash'] = md5($YOUR_SALT.$username.$_SERVER['HTTP_USER_AGENT']); 

//用户名散列,以避免操纵

避免由谁来操作? 神奇的会话小精灵? 除非你的服务器被攻破你的会话变量将不会被修改。 哈希是唯一真正有很好地凝结在串入一个48字符的字符串(用户代理可以得到一个有点长)。

至少但是我们现在正在检查一些客户数据,而不是检查每个会话的数据,他们已经检查HTTP_USER_AGENT(这是确定浏览器中的字符串),这大概是足以保护你更多,但你必须认识如果该人已经采取你的sessionId以某种方式,没准你也被送到坏人服务器的请求,并给坏人您的用户代理,所以聪明的黑客会欺骗你的用户代理,战胜这一保护。

这是被你到了可悲的事实。

只要您的会话ID被泄露,你就完了。 您可以检查请求的远程地址,并确保停留在所有请求相同的(像我一样),并会为您的客户群的99%,很好地工作。 然后有一天,你会得到谁使用负载平衡的代理服务器的网络用户的呼叫,请求将被从这里通过一组不同的IP的(即使是错误的网络上有时)出来,他会失去他会话左,右和中心。



Answer 3:

你可以在PHP会话安全指南这里 。



Answer 4:

您可以存储IP地址,浏览器特征等识别用户。 在每个请求,检查它与当前值是否有任何可疑的事情。

要知道,有些人是使用绝对动态IP地址提供商后面,所以那些人可能会经常登出。



Answer 5:

我想第二个需要被“LOGGED_IN”?

关于会话安全的一些资源:

phpsec

shiflett



Answer 6:

你可以偷通过JavaScript(XSS-> crossside脚本攻击)..你应该总是用 MD5哈希,以确保您的会话的会话。

为了避免会话劫持,你应该把用户代理

$ _ SERVER [ 'HTTP_USER_AGENT']

到哈希为好。

在您的例子:

$_SESSION['logged_in'] = 1;
$_SESSION['username']  = $username; // user's name
$_SESSION['hash']      = md5($YOUR_SALT.$username.$_SERVER['HTTP_USER_AGENT']); // user's name hashed to avoid manipulation

使用会话之前,请确保它使用了正确的散列:

if (!$_SESSION['hash']==md5($YOUR_SALT.$username.$_SERVER['HTTP_USER_AGENT'])){
  die ('session hash not corrected')
}


Answer 7:

为了防止会话固定,这基本上是猜测SID或使用各种方法偷盗。 不管你的会话逻辑如何sophistacated,它肯定会是脆弱的sessid偷到一定程度。 这就是为什么你必须重新生成ID每次你做一些重要的事情。 例如,如果你会被制作后或改变在管理,首先运行会话再生-ID的设置。 那么黑客要经过再次入侵你的过程。 这基本上使黑客拍摄与ID与所有他浪费了时间一次。

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

或者你可以在每次更换ID,以便转弯

如果($ _ SESSION [ '计数器'] == 3){session_regenerate_id(); $ _ SESSION [ '计数器'] == 0}

此外,$ _ SERVER [“HTTP_USER_AGENT”]是不是很可靠。 尽量避免它,不仅因为这个原因,而是因为它的方便黑客BC他们知道药广泛用于此目的。 相反,尝试使用$ _SESSION [ 'id_token'] = SHA1(如文件存储,文件名一些疯狂的信息,时间)。



Answer 8:

这是通常的登录密码,可以做了一些改进,使其更难破解。 首先,你可以用用户名和日志或交替的时候,一个预定义的字符串(或盐)的校验和,并将其存储在会话中,并进行比较。

因此,当用户登录:

// not the most secure hash!
$_SESSION['checksum'] = md5($_SESSION['username'].$salt); 

而在进入之前的敏感区域:

if (md5($_SESSION['username'].$salt) != $_SESSION['checksum'])
{
  handleSessionError();
}

默认情况下,会议常常作为存储在服务器端的文件和cookie被放置在用户的浏览器记住引用的文件。 当谈到会议的黑客攻击,不知何故黑客获取足够的信息来复制日志,或设法改变会话数据,通过使用从cookie信息。

你可以编写自己的会话处理使用的数据库以增加安全性。 一些严格的CMS,如Joomla,也记录了IP。 然而,对于人来说,这导致问题使用某些ISP



Answer 9:

当我遇到这个问题,同时建立SugarCRM的,我跟踪和验证的用户(除一些其他的事情)的IP地址。 我只比较了IP地址的前三个部分。 这使得大多数本地变量的IP地址。 我也使人们有可能关闭的设备的IP地址验证其中IP地址的主要变化是常见的。 我认为只有比较IP地址的开头可以帮助您与安全性,而不加入这样一个严重的限制,以您的应用程序。

例:“### ### ### ---。”标有“#”的IP地址只有一部分会被验证。

192.168.1.101
192.168.1.102
192.168.1.XXX

都被认为是相等的。

雅各



文章来源: What do I need to store in the php session when user logged in?