目前,当用户登录时,我创造了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/
刚刚发现的联系,是这些方法不够好? 请给你的意见。 我还没有得到最好的答案。
术语
- 用户:访问者。
- 客户端:安装在特定机器上的一个特定的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
被泄露,你几乎完蛋了。 上述策略只是头痛医头,脚痛医脚。
这是荒唐的。
当(通常是通过一个跨站脚本攻击)有人截获您的sessionId(这是由浏览器自动发送到Web服务器一个cookie)发生会话劫持。
有人张贴了这个,例如:
因此,当用户登录:
//不是最安全散列! $ _SESSION [ '校验'] = MD5($ _ SESSION [ '用户名'] $盐);
而在进入之前的敏感区域:
如果(MD5($ _ SESSION [ '用户名'。$盐)!= $ _SESSION [ '校验']){
handleSessionError(); }
让我们去通过什么不对这个
- 盐 - 没有错,但毫无意义。 没有人是破解你那该死的MD5,谁在乎它是否盐腌
- 会话变量的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的(即使是错误的网络上有时)出来,他会失去他会话左,右和中心。
您可以存储IP地址,浏览器特征等识别用户。 在每个请求,检查它与当前值是否有任何可疑的事情。
要知道,有些人是使用绝对动态IP地址提供商后面,所以那些人可能会经常登出。
你可以偷通过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')
}
为了防止会话固定,这基本上是猜测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(如文件存储,文件名一些疯狂的信息,时间)。
这是通常的登录密码,可以做了一些改进,使其更难破解。 首先,你可以用用户名和日志或交替的时候,一个预定义的字符串(或盐)的校验和,并将其存储在会话中,并进行比较。
因此,当用户登录:
// 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
当我遇到这个问题,同时建立SugarCRM的,我跟踪和验证的用户(除一些其他的事情)的IP地址。 我只比较了IP地址的前三个部分。 这使得大多数本地变量的IP地址。 我也使人们有可能关闭的设备的IP地址验证其中IP地址的主要变化是常见的。 我认为只有比较IP地址的开头可以帮助您与安全性,而不加入这样一个严重的限制,以您的应用程序。
例:“### ### ### ---。”标有“#”的IP地址只有一部分会被验证。
192.168.1.101
192.168.1.102
192.168.1.XXX
都被认为是相等的。
雅各