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受到侵害,那么您就已经做好了。以上策略只是权宜之计。
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(有时甚至在错误的网络上)从此处发出,他将丢失自己的电话会议左,右,中。
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(一些疯狂的信息,例如文件内存,文件名,时间)。
添加回答
举报