如何防止多个客户端使用相同的会话ID? 我问这是因为我想添加一个额外的安全层,以防止在我的网站会话劫持。 如果黑客以某种方式计算出其他用户的会话ID,使请求与SID,我怎么能检测到有不同的客户端服务器上共享一个SID,然后拒绝劫持企图?
编辑
我已经接受了经过深思熟虑浓汤的答案,因为我已经开始认识到什么,我要求的是不可能的,因为一个无状态的HTTP协议的限制。 我忘了什么也许是HTTP的最根本的原则,现在,我认为这个问题似乎有点微不足道。
让我解释我的意思:
之后用户A在example.com上登录时,他给出了一些随机会话ID,为简单起见,让它成为“ABC123”。 这个会话ID存储在客户端的cookie,并与服务器端会话验证,以确保谁登录遗体身份登录,他从一个网页移动到另一个用户。 当然,这个cookie就不需要存在,如果HTTP不是无状态的。 因此,如果用户B窃取用户A的SID,并创建自己的计算机使用值“ABC123”上的cookie,他就已经成功地劫持用户A的会话,但根本就没有办法对服务器合法地认识到,用户B的请求是来自用户A的请求的任何不同,因此,服务器没有理由拒绝任何请求。 即使我们列出了已经在服务器上活动的会话和尝试,看看是否有人正在访问会话已经激活,我们怎么能确定它是谁在非法访问会话的其他用户,而不是相同的用户谁是已经与会话ID登录,但简单地试图与它的另一个请求(即导航到不同的网页)。 我们不能。 检查用户代理? 可能是虚假的 - 但好于深度措施仍然国防部。 IP地址? 可以更改正当理由 - 但不是为IP地址不检查所有,我建议检查类似的IP的两个字节,作为一个数据计划的网络谁经常有变化的IP为完全合法的理由上,即使用户只会通常有自己的IP变化的最后两个字节。
在consclusion,它是谴责我们永远无法充分保护我们网站的会话劫持,但好的做法(如浓汤提供了的)就可以了,以防止一个良好的多数会议袭击无状态HTTP。 因此,试图通过拒绝相同的SID的多个请求,以防止劫持会话简直是荒唐可笑的,并会破坏会议的全部目的。
Answer 1:
不幸的是,要明白无误地确定从相反的真正要求攻击者发起的请求没有有效的方法。 因为计数器测量大多数属性检查等的IP地址或用户代理的特性或者是不可靠的(IP地址可能多个请求中变化),或者可以很容易被伪造(例如用户代理请求报头),并且因此可以产生不需要的假阳性(即正版用户切换IP地址)或假阴性(即攻击者能够成功地创造出具有相同的User-Agent请求)。
这就是为什么以防止会话劫持最好的方法是,以确保攻击者无法找出其他用户的会话ID。 这意味着你应该设计自己的应用程序和它的会话管理:(1)攻击者无法通过足够的熵猜测有效的会话ID,和(2)有攻击者没有其他办法由已知的攻击,以获得一个有效的会话ID / vulerabilities像嗅探网络通信,跨站点脚本,通过Referer的泄漏等
这就是说,你应该:
- 使用足够的随机输入用于生成会话ID(见session.entropy_file , session.entropy_length和session.hash_function )
- 使用HTTPS传输过程中保护会话ID
- 存储会话ID在Cookie中,而不是在URL,以避免泄漏的Referer虽然(见session.use_only_cookies )
- 设置与该cookie
HttpOnly
和Secure
属性禁止(在XSS弱点的情况下)通过JavaScript访问和经由不安全信道,禁止传输(见session.cookie_httponly和session.cookie_secure )
除此之外,你还应该重新生成会话ID,而无效旧的(见session_regenerate_id
功能 )某些会话状态更改后(例如,登录或授权/权限更改后真实性的确认),并且你还可以这样做定期的时间缩短跨越一个成功的会话劫持攻击。
Answer 2:
我们可以做这样的事情。
在数据库中存储会话ID。 另外存储的IP地址和该会话ID的HTTP_USER_AGENT。 现在,当一个请求到达包含匹配会话ID,从代理检查和IP它是从你的脚本来的服务器。
可以通过进行常用功能或会话类此丰达工作,以便在被处理前每个请求验证。 这将很难采取一些微秒。 但是,如果许多用户正在访问你的网站,你有会议的庞大的数据库,那么这可能是小的性能问题。 但是,它肯定是非常安全o其他方法,比如=>使用再生会议进行比较。
在再生会话ID,再有就是会话劫持的机会不大。
假设,用户的会话ID被复制,并且用户无法正常工作或活动了一段时间,并没有请求与旧的会话标识要求重新生成新的服务器进行。 然后,如果会话ID被劫持,黑客会使用会话ID,并请求与该ID服务器,然后服务器将响应回来再生会话ID,并让黑客可以继续使用这些服务。 实际用户将不再能够运行,因为他不知道什么样的再生ID是什么,请求会话ID是在请求传递。 完全消失了。
如有我错了地方指正。
Answer 3:
有很多针对会话劫持标准的防御。 其中之一是每个会话匹配到一个单一的IP地址。
其他方案可以使用HMAC从产生:
- 客户端的IP网络地址
- 由客户机发送的用户代理报头
- 该SID
- 存储在服务器上的密钥
仅使用IP的网络地址的原因是在情况下,用户的背后是公共代理,在这种情况下,他们的IP地址可以与每个请求改变,但网络地址保持不变。
当然,真正是安全的,你真的应该强制SSL所有请求,以使SID不能被可能的攻击者在第一时间截获。 但并非所有的网站这样做(::咳嗽:: 堆栈溢出 ::咳嗽::)。
Answer 4:
在我看来,你可以存储在数据库中的会话ID,当用户登录并检查每个人都在洛以前一样。删除您已经存储在数据库中,当用户注销相同的会话ID。 您可以轻松地findout每个用户的会话ID,否则我可以帮你。
Answer 5:
一个简单的实现可以通过数据库做一个表来完成,如登录的用户,然后在登录,更新表的用户名和他的SID,这会阻止其他登录为相同的用户,现在注销的时间,只需运行一个简单的查询,这将删除记录在数据库中的数据,这也可以用来在用户追查登录乌尔网站的时间。
Answer 6:
显然,当你在浏览器中设置会话cookie,该cookie在请求中发送。 现在,当请求到来时,服务器将检查在数据库中的会话ID和授予访问权限。 为了避免只有其存储代理和IP重要,这样之前检查服务器可以确保会话访问权限授予的唯一客户端,而不是可以被劫持的唯一会话ID。
Answer 7:
我不知道编码部分很好。 所以,我可以告诉ü一个算法来做到这一点。 设置东西像SSL,或设置会话cookie保护和仅Http如果用户从一个LAN网络嗅探会话ID不会工作(提供用户和攻击者都在同一个局域网)。
所以你可以做的是,一旦用户成功登录到应用程序,设置唯一的令牌每Web应用程序的每一个页面,并保持这个轨道在服务器端。 所以,如果有效用户发送访问特定页面的请求,该页面的标记也将被发送到服务器端。 由于令牌是针对特定会话的用户唯一的,即使攻击者可以获取会话ID,他不能劫持用户会话,因为他无法提供有效的令牌服务器。
Answer 8:
@Anandu中号达斯:
我相信你可能是指与每个会话ID使用会话令牌。 这个网站可以解释的使用,用会话令牌:
https://blog.whitehatsec.com/tag/session-token/
虽然会话令牌很容易被XSS攻击破坏,这并不意味着他们不应该被使用。 我的意思是让我们面对它,如果事情是在服务器上的安全漏洞compromisable,它不是方法的故障时,程序员的过错谁介绍了该漏洞(突出的Hesson和鲁克做出点)。
如果你遵循适当的安全公约和practicies和SQL注入,XSS保证站点的安全,并要求所有会话管理通过HTTPS,那么你就可以轻松地管理从CSRF利用服务器端的令牌的潜在的攻击,存储在会话中,并且每次更新用户会导致操纵自己的会话(如提交一个$ _ POST)。 另外,不要存储会话或者其内容的URL,无论你如何认为他们进行编码。
当您的用户的安全是最重要的(这应该是),使用会话标识将允许在不影响他们的会话安全提供更好或更高级的功能。
Answer 9:
会话劫持是一个严重的威胁,它通过使用先进的应用程序,它涉及到交易安全套接字层或通过使用简单的技术,如使用cookie,会话超时处理和再生ID等如上所述。
当互联网的诞生,HTTP通信被设计为无状态的; 即,两个实体之间的连接只存在用于所需的请求被发送到服务器时的短暂时间,并将得到的响应传递回客户端。 下面是该黑客跟随劫持会话的几种方法
- 网络窃听
- 不知情曝光
- 代理,代理和网络钓鱼
- 反向代理
总是建议SSL 安全套接字层
使用Cookie还以脚本的开始之后的ini_set()指令,以覆盖php.ini的任何全局设置:
ini_set( 'session.use_only_cookies', TRUE );
ini_set( 'session.use_trans_sid', FALSE );
使用会话超时和会话ID重新生成
<?php
// regenerate session on successful login
if ( !empty( $_POST['password'] ) && $_POST['password'] === $password )
{
// if authenticated, generate a new random session ID
session_regenerate_id();
// set session to authenticated
$_SESSION['auth'] = TRUE;
// redirect to make the new session ID live
header( 'Location: ' . $_SERVER['SCRIPT_NAME'] );
}
// take some action
?>
文章来源: Preventing session hijacking