看到他们的PHP session_id()是安全还是不安全?

时间:2018-12-18 15:09:56

标签: javascript php jquery security session

在我的网站上,我有一些jquery正在从登录表单向我的API发出发布请求。这是jquery:

function doLogin()
{
  var userEmail = $("#email").val();
  var userPassword = $("#password").val();

  $.post(
    "https://api.linkenfest.co.uk/access/login/<?= $referrer ?>",
    {
      email: userEmail,
      password: userPassword
    }
  ).done(function( data ){
    var status   = data.data.status;
    var referrer = data.data.referrer;
    var message  = data.data.message;
    var session  = data.data.session;

    alert( message );

    if( status == 200 ){
      window.location.replace( referrer + "?session=" + session );
    }
  }
);

返回成功后,我的api响应如下:

{
  "status": 200,
  "data":{
          "status": 200,
          "referrer": "page.php",
          "message": "Successful login",
          "session": "o3vo1uram0k2mojmbd45pmicr2"
      }
}

从我的回复中可以看到,它包括从php session_id()获得的值

我想知道向用户提供此信息是否会打开网站上的安全漏洞。

会话ID值用于在window.location.reload之后启动会话

谢谢。

1 个答案:

答案 0 :(得分:0)

正如其他人在评论中已经指出的那样,获得会话ID的客户端是管理会话的标准方法-在随后的请求中还可以如何发送它?但是客户端如何接收它确实很重要。

请注意,上面的代码很容易受到攻击。

  1. "https://api.linkenfest.co.uk/access/login/<?= $referrer ?>"-如果$ referrer是请求中的Referer标头,则这反映为XSS。在Java上下文中,仅进行html编码是不够的,您需要javascript编码。

  2. window.location.replace( referrer + "?session=" + session )-从技术上讲,这是对Referrer参数的开放重定向。但是,利用它并​​不容易。最佳实践仍然是对其进行验证(最好在服务器上-可能已经安装了)。

  3. 会话管理薄弱,会话ID可用于Javascript。尽管在某些情况下这是可以接受的,但是接受这种风险应该是一个有意识的决定。会话ID通常(传统上)应在httpOnly cookie中设置。无法做到这一点的一个例外是需要将令牌发送到其他来源。但是在这种情况下,从语义上来说这不是会话ID,因此应该有适当的SSO解决方案。

  4. 会话ID是敏感信息,因此,不应在url中发送。 url的问题在于它被记录在多个位置(用户的浏览器会记住它并将其保存到磁盘,它将被记录在中间代理以及目标服务器的日志中。这些都是攻击者可能从中获取的位置最好不要在url中发送敏感信息,而应该在标头(cookie也是标头)中发送,或者在需要时也可以发送请求正文。

  5. 目标网址(api.linkenfest.co.uk)如果允许您以这种方式登录,则很容易登录csrf。

还要从更广阔的角度看待这个问题,我想您正在使用api作为身份提供者来登录您的用户。为此,您应该使用标准协议(例如OpenID Connect),而不要重蹈覆辙,因为正如您在上面看到的那样,它一点也不简单。