【问题标题】:How to prevent session hijacking with a user's session in CGI Perl?如何在 CGI Perl 中防止用户会话劫持?
【发布时间】:2012-09-22 21:41:40
【问题描述】:

我有一个由少数人使用的网络应用程序(仅供内部使用),并且正在使用存储在用户记录下并放置在各种链接中的随机 sessionID。

我遇到了用户相互发送链接的问题,这使他们能够劫持发件人的会话。

有哪些方法可以防止这种情况发生,同时仍允许用户相互发送链接?

编辑: 链接中的会话 ID(也包含 $username)只是与存储在 User 表中的内容进行比较。 &incorrectLogin 只是打印一个错误,然后是 die;

if ($sid) {

    $sth = $dbh->prepare("SELECT * FROM tbl_User WHERE UserID = '$username'");
    $sth->execute();

    $ref         = $sth->fetchrow_hashref();
    $session_chk = $ref->{'usr_sessionID'};

    unless ($sid eq $session_chk) {

        &incorrectLogin;
    }
}

问题在于,如果有人使用由其他人创建的链接,则页面将按照他们的身份加载。我没有使用 cookie,我记得过去有人告诉我 CGI perl cookie 处理很差。

【问题讨论】:

  • 我们需要了解更多。你用什么来认证?您是否在用户的机器上设置了 cookie?为什么要使用 sessionId 的查询字符串?我们可以看看一些代码吗?
  • 抱歉。我在原帖中添加了一些附加信息。

标签: perl session cgi


【解决方案1】:

在切换到 cookie 之前,我曾经非常像您现在所做的那样处理会话管理。现在,我使用CGI::Session,对此我非常满意。

然而,如果您想在短期内更快地解决您的问题,您可以做的一件事是将每个会话的 IP 地址与会话 ID 一起存储。然后,如果传入的 IP 地址/会话 ID 对与您存储的不匹配,您可以重定向到您的登录页面。

这种方法确实存在一些缺陷并且并不完美,但它确实弥补了您目前存在的巨大安全漏洞。

【讨论】:

    【解决方案2】:

    首先,查询字符串(或会话 ID)不应包含用户 ID。当您收到会话 ID 时,您会查看存储在服务器端的会话信息以检索与该会话 ID 关联的用户 ID。

    其次,您应该在一定数量的不活动后使会话过期。

    第三,您可以在服务器端会话中存储两个额外的项目,以帮助您在不使用 cookie 的情况下解决此问题。解决方案并不完美,即仍有机会劫持会话,但会使其变得更加困难。

    在服务器端,存储用户登录的 IP 地址。如果您收到来自不同 IP 的同一会话的后续请求,请再次请求凭据。不要在查询字符串中包含 IP 地址。

    此外,对于每个响应,生成一个next_request_id。将其存储在服务器端会话中,并将其发送回客户端。您返回的页面上的所有链接也必须包含此next_request_id

    当您收到请求时,请检查您收到的next_request_id 是否与您为该会话存储的相同。如果不是,请重新认证。

    现在,这将影响用户使用具有多个选项卡的网站或使用重新加载/刷新的能力,但在特定用例中这对我来说是一个合适的解决方案。

    但是,在一般情况下,您最好使用 cookie。

    使用cookies over plain HTTP 时,会话仍然可能被劫持,但至少可以防止这种特殊故障。

    【讨论】:

      【解决方案3】:

      如果查询字符串包含您用于会话身份验证的所有信息,那么您就被设计成水管了。您将需要找到某种方法将用户名或会话 ID,或者最好将两者都放入 cookie;否则,您将成为 SOL,因为您无法阻止用户发送的链接包含您的代码用来告诉其正在与哪个用户交谈的所有内容。

      如果我是你,我会首先查明 CGI.pm 在 cookie 方面的表现是否像我被告知的那样糟糕,如果是这样,我会继续滚动我自己的 Cookie: 标头。我能看到的唯一另一种选择是将应用程序中的所有链接都转换为 POST 请求,这既更糟糕,也太可怕了,无法考虑。

      【讨论】:

      • 谢谢,我同意解决方案在于至少从 URL 中提取一些身份验证。我还没有使用 cookie 的经验,所以我首先只是想找到开始学习的最佳场所。
      猜你喜欢
      • 2012-08-27
      • 2017-12-22
      • 2010-11-28
      • 2012-05-19
      • 2017-05-27
      • 2017-06-15
      • 2012-02-20
      • 1970-01-01
      相关资源
      最近更新 更多