【问题标题】:Is it secure to explicitly setting session IDs in HTTP Requests?在 HTTP 请求中显式设置会话 ID 是否安全?
【发布时间】:2019-08-11 05:02:51
【问题描述】:

我的帐户系统位于accounts.example.com

当用户在accounts.example.com 登录时,会话ID 将保存在.example.com 上可用的cookie 中(在所有子域中)

subdomain.example.com 在另一台服务器上,它无权访问帐户系统的会话数据和数据库。我如何检查用户是否登录是我获得了会话 ID(因为它在所有子域中都可用)。然后,我使用会话 ID 和密码(保护 HTTP 请求的密码)向帐户服务器发送 HTTP 请求。

来自subdomain.example.com的HTTP请求如下。

$sessionId = $_COOKIE[$sessionCookieName];
$post = http_build_query(
    array (
        'http_secret' => AUTH_HTTP_SECRET,
        'session_id' => $sessionId
    )
);

$opts = array('http' => 
    array (
        'method' => 'POST',
        'user_agent' => $_SERVER['HTTP_USER_AGENT'],
        'content' => $post
    )
);

$context = stream_context_create($opts);
$url = 'https://account.example.com/check-login';
$response = @file_get_contents($url , false, $context);

所以,一个 HTTP 请求将被发送到accounts.example.com/check-login

check-login.phpaccounts.example.com 如下。

$httpSecret = $_POST['http_secret'];
// if it is from an invalid client
if  ($httpSecret !== HTTP_SECRET) {
    throw new Exception('HTTP Error');
}

$sessionId = $_POST['session_id'];

# set the session ID
session_id($sessionId);

# then, I get the session data and checks if the user is logged in

如果用户已登录,我会将与帐户相关的数据返回给subdomain.example.com

这种方法是好是坏?

提前致谢。

【问题讨论】:

  • subdomain.example.com 是如何获得密码的? Then I get session data 怎么样?您刚才说您无权访问会话数据,因为子域在另一台服务器上?
  • 我的意思是,我发送了一个密码:它是保护服务器 HTTP 请求的密码。它不是用户的密码。它只是为了验证 HTTP 请求。明白了吗?
  • 明白。那么如何“获取会话数据”呢?那部分是否发生在另一台服务器上,并且您在响应中返回数据?如果您将发生的事情标记在哪里会有所帮助
  • 用户如何注销?
  • 我编辑了我的答案,用户可以从accounts.example.com/logout 注销。它将删除保存在帐户服务器中的所有会话数据。因此,下一个 HTTP 请求将返回 false 到问题“是否已登录?”

标签: php security session


【解决方案1】:

它没有安全漏洞。这就是您首先拥有该功能的原因之一。

如果您希望审核您的代码,请尝试https://codereview.stackexchange.com/

【讨论】:

  • 投反对票原因:答案没有提供足够的信息并且含糊不清。为什么要定期轮换 id 以及 configured properly 是模棱两可的。它留下了太多的假设,它应该是一个评论。
  • 你能解释一下吗?我想我已经正确配置了选项。但是,如果你确切地说出它们是什么,我可以用我的来准确地检查它们。谢谢。
  • 我认为知道如何配置会话超出了本次比赛的范围。从问题来看,由于 php 没有为他/她生成会话 id,依靠 php 在过期时使它们无效听起来并不理想
  • 当用户登录时,PHP 会生成会话 ID。而且,我不明白你的意思。
  • @Mjh 是的,你是对的。不需要轮换。
【解决方案2】:

不,它不安全,您应该为此使用 HTTPS。

【讨论】:

  • 我不认为是这样。我使用 HTTPs 进行服务器间通信。我认为这是一件简单的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-17
  • 2013-02-03
  • 1970-01-01
  • 2016-02-18
  • 2018-05-10
  • 2012-02-06
  • 2011-05-05
相关资源
最近更新 更多