2011-08-04 61 views
0

我有一个web服务(ASP.NET 2.0),我使用jQuery的$.ajax()从javascript调用。我被告知会话密钥经常被用作此类情况下的一个随机数,用于安全目的; Web服务将一个键作为其参数之一,并且只在与当前会话键匹配时才返回数据。用于Web服务安全性的ASP.NET会话密钥?

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

这是可以解决的,或者我应该以另一种方式做到这一点?

编辑:代码设置会话隐藏字段中的请求。

hfSession.Value = Context.Session.SessionID; 

这是在的.ascx控制Page_Load,不受任何条件(即不包裹着if (!Page.IsPostBack)

+0

你能张贴“的隐藏字段的值设置为当前的SessionID代码在每一个Page_Load(即每回发)“ – shashi

+0

@sassyboy - 完成。 –

回答

2

Asp.net实际上为每个请求生成一个新的会话ID,直到您使用会话状态存放一些值,这可能是一个原因的值是不同的。请尝试和保存的东西了会议。也许

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

这样做了。谢谢! –

0

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

2

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

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?

+0

好点。我将来会在此网站上推送SSL,但如果没有,那么我会将其更改为使用随机数字。 –