2012-06-13 54 views
1

我們的客戶端要求加密URL,因爲它正在傳遞查詢字符串中的值。我們已經使用加密並能夠加密URL;但是,現有代碼在許多地方使用querystring["var"],並且由於加密的URL而失敗。因此,在頁面加載時,我們將不得不解密URL。如果我使用response.redirect解密並更改查詢字符串,則查詢字符串將在URL中可見並可能被濫用。在asp.net中動態更改查詢字符串

請幫忙。

編輯 我在讀RESTfull web服務。我還沒有理解整個概念。我想知道是否可以在我的應用程序中使用它來隱藏查詢字符串。如果有,請告訴我。

謝謝。

回答

1

實現這一點很少頭痛的一種方法是解密查詢字符串,就像您當前所做的那樣,然後將其值設置爲可存儲在會話中的某個對象。如果您想從查詢字符串中排除這些信息(隱藏),將它存儲在會話變量中會很有用 - 您本質上是在後臺傳遞數據。

一旦存儲在會話中,您將更改您的代碼,無論您使用何處querystring["var"],您將改爲參考存儲在會話中的對象。

編輯

但是請注意,這並沒有被轉移到一個單一的值。這個對象可以有每一個代表查詢字符串值的多個屬性:

MyQueryStringObject myQueryStringObject = new MyQueryStringObject(SomeUrl); 
//MyQueryStringObject decrypts the query string and assigns the values to properties in its constructor 
string abc = myQueryStringObject.abc; 
string xyz = myQueryStringObject.xyz; 

現在,使用屬性來表示每個查詢字符串值。你可能有很多。在這種情況下,您可以將這些值存儲在某種DictionaryNameValueCollection中。

有各種各樣的方式來實現這一目標,我認爲是超越的話題,但是,請注意,關鍵這一切的本質是簡單地解密服務器的URL(回發期間)和如果要將其隱藏在URL中,請將未加密的數據保存到會話變量中。

+0

如果我只有一個querystring [「var」],那麼您的邏輯很有用。 Howerver,我的應用程序有近800頁,並且在查詢字符串中使用了不同的名稱。例如querystring [「abc」] = 1和querystring [「xyz」] = 2。我不確定確切的數字,但還有更多。非常感謝您的回覆。請提出一些更多的想法。 – Akie

+0

編輯我的答案。 – Jeremy

1

有更好的方法來解決這個問題。我與一個有相同要求的客戶打交道。這個班級也通過安全掃描飆升。

Public Class QueryStringManager 

    Public Shared Function BuildQueryString(ByVal url As String, ByVal queryStringValues As NameValueCollection) As String 
     Dim builder As New StringBuilder() 
     builder.Append(url & "?") 
     Dim count = queryStringValues.Count 
     If count > 0 Then 

      For Each key In queryStringValues.AllKeys 
       Dim value As String = queryStringValues(key) 
       Dim param As String = BuildParameter(key, value) 
       builder.Append(param) 
      Next 

     End If 
     Return builder.ToString() 
    End Function 

    Public Shared Function DeconstructQueryString(ByVal Request As HttpRequest) As NameValueCollection 
     Dim queryStringValues As New NameValueCollection 

     For Each key In Request.QueryString.AllKeys 
      Dim value As String = Request.QueryString(key) 
      value = DeconstructParameter(value) 
      queryStringValues.Add(key, value) 
     Next 

     Return queryStringValues 
    End Function 

    Private Shared Function BuildParameter(ByVal key As String, ByVal value As String) As String 
     Dim builder As New StringBuilder() 
     builder.Append(key.ToString() & "=") 
     value = GetSafeHtmlFragment(value) 
     Dim encrypt As Security = New Security() 
     value = encrypt.Encrypt(value) 
     builder.Append(value) 
     builder.Append("&") 
     Return builder.ToString() 
    End Function 

    Public Shared Function DeconstructParameter(ByVal value As Object) As String 
     Dim decrypt As New Security() 
     value = decrypt.Decrypt(value) 
     value = GetSafeHtmlFragment(value) 
    End Function 


End Class 

使用

Dim nvc As NameValueCollection = New NameValueCollection() 
nvc.Add("value", 1) 
Dim builtUrl As String = QueryStringManager.BuildQueryString(url, nvc) 
Response.Redirect(builtUrl, false); 

然後當你到你的頁面簡單地寫:

Dim decryptedValues As NameValueCollection = QueryStringManager.DeconstructQueryString(Request) 

爲什麼我用NameValueCollection是因爲這是同一類型的原因作爲QueryString。你可以建立基於它的屬性和它們的值的類,以將對象添加到QueryString中。這將所有複雜而乏味的邏輯封裝起來。

+1

除了Response.redirect之外,David說的一切都改變了Context.RewritePath(http://msdn.microsoft.com/en-us/library/system.web.httpcontext.rewritepath.aspx) - 如果你重定向,它將再次處於查詢字符串中 –