2011-08-04 100 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,但如果沒有,那麼我會將其更改爲使用隨機數字。 –