如何在javascript中获取会话ID

时间:2013-12-04 00:11:33

标签: javascript hash csrf

目前我被要求阻止我们的网络应用程序中的CSRF附加。 我是网络应用程序的新手。

任何人都可以帮我解决这个问题

我已获得指南

实现此修复的一种简单方法是让每个页面都呈现一些额外的隐藏变量。

var1 = hmac_sha256(timestamp+session_id, secret)
var2 = timestamp

在后端,您可以通过创建带有时间戳的服务器端密码的hmac来获取时间戳并对其进行验证。如果有效,并且时间尚未过去,您可以允许请求继续。这允许您在页面上设置过期并验证其创建,从而减轻跨站点请求伪造攻击。不应该两次使用相同的有效令牌。

我已经确定了做同样的步骤。

  1. 在java脚本中生成会话ID。
  2. 在服务器端(servlet)生成密钥。
  3. 从服务器向客户端发送密钥(可能在登录页面中)。
  4. 通过生成时间戳,seeion id和密钥来保持csrf令牌隐藏。

    var $csrfToken = hmac_sha256($timestamp +$seesionId + $mySecretKey)

  5. 如果获得

    ,请在服务器端解密

    var $stringToHash = request.get('key')
    var $isValidToken = hmac_sha256($timestamp +$seesionId + $mySecrtKey) == request.get('csrfToken')

  6. 然后继续servlet中的请求处理。

    任何人都可以帮我处理代码段。

2 个答案:

答案 0 :(得分:1)

我们正在使用的过程是存储csrf令牌(由服务器生成,生成它的位置,而不是客户端。这是一个跨站点请求防伪机制,因此服务器需要能够验证它是一个真正的令牌,而不是客户端)在<meta name="csrf-token" value="...">元素(它是一个W3C验证名称)中,然后在使用jQuery的beforeSend执行AJAX调用时将其作为请求头传递:

var csrf_token = $("meta[name='csrf-token']").attr("content");
...
$.ajax({
  type: "POST",
  url: ...,
  data: {
    ...
  },
  beforeSend: function(request) {
    request.setRequestHeader('X-CSRF-Token', csrf_token);
  },
  ...
});

在这种情况下,服务器需要标头为X-CSRF-Token,因为我们使用带有express的nodejs,它使用connect,这需要特定的字符串。

答案 1 :(得分:0)

您是否正确地进行CSRF可能是另一篇文章的讨论。您最初的问题是如何在Javascript中获取会话ID。会话ID通常存储为cookie,但根据服务器的不同命名。来自Session Id上的维基百科页面。

  • JEE = JSESSIONID
  • PHP = PHPSESSID
  • ASP = ASPSESSIONID

然后,您可以使用jquery-cookie之类的库来访问正确的Cookie并获取会话ID。