【问题标题】:ASP.NET session key for web service security?用于 Web 服务安全的 ASP.NET 会话密钥?
【发布时间】:2012-06-26 23:09:21
【问题描述】:

我有一个使用 jQuery 的 $.ajax() 从 javascript 调用的 Web 服务 (ASP.NET 2.0)。有人告诉我,出于安全目的,会话密钥通常在这种情况下用作随机数; Web 服务将密钥作为其参数之一,并且仅在与当前会话密钥匹配时才返回数据。

我试图通过在每个Page_Load(即每个回发)上将隐藏字段的值设置为当前 SessionID 来完成此操作,然后在 javascript 中将其作为参数传递。但它永远不会与 Web 服务的当前密钥 (Context.Session.SessionID) 相同。

这是否可以解决,或者我应该以另一种方式解决?

编辑:根据要求在隐藏字段中设置会话的代码。

hfSession.Value = Context.Session.SessionID;

这是在 .ascx 控件的 Page_Load 中,不在任何条件下(即不使用 if (!Page.IsPostBack) 包装。

【问题讨论】:

  • 您能否发布代码“在每个 Page_Load(即每个回发)上将隐藏字段的值设置为当前 SessionID”

标签: asp.net ajax web-services


【解决方案1】:

Asp.net 实际上为每个请求生成一个新的会话 ID,直到您使用会话状态来存储一些值。这可能是价值观不同的原因。尝试在会话中保存一些内容。也许

Session["SessionID"] = Context.Session.SessionID;
hfSession.Value = Context.Session.SessionID;

【讨论】:

    【解决方案2】:

    我相信您正在尝试防止跨站点脚本请求伪造 (CSRF)。会话 ID 实际上是作为 cookie 发送的,攻击者可以设置它。您应该使用存储在 Session 变量中的随机生成的数字,而不是使用 Session ID 本身。

    String GetCSRFToken()
    {
        String token = (String)Session["CSRFToken"];
        if( token == null )
        {
            token = GenerateLongRandomString();
            Session["CSRFToken"] = token;
        }
        return token;
    }
    
    void AssertValidCSRFToken(String token)
    {
        if( token != GetCSRFToken() )
        {
            throw new Exception("Invalid Request!")
        }
    }
    

    这是另一个问题的链接,其中包含有关防止此类攻击的更多信息:

    CSRF Validation Token: session id safe?

    【讨论】:

    • 好点。以后我会在这个网站上推动 SSL,但如果这没有发生,那么我会将其更改为使用随机数。
    【解决方案3】:

    每次页面加载时都会生成一个新的 SessionID,直到会话被实际分配。因此,如果您实际上没有为会话分配任何内容,则 SessionID 将在每次页面加载时发生变化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-12
      • 1970-01-01
      • 1970-01-01
      • 2016-06-06
      • 2019-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多