我们的客户要求加密URL,因为它在查询字符串中传递值。我们使用了加密并能够加密URL;但是,现有代码在很多地方使用querystring["var"]
,并且由于加密的URL而失败。因此,在页面加载时,我们将不得不解密URL。如果我使用response.redirect
解密并更改查询字符串,则会再次在URL中显示查询字符串,并且可能会被滥用。
请帮忙。
修改 我正在阅读有关RESTfull Web服务的内容。我还没有理解整个概念。我想知道我是否可以在我的应用程序中使用它来隐藏查询字符串。如果有,请告诉我。
感谢。
答案 0 :(得分: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;
现在,它使用属性来表示每个查询字符串值。你可能有很多。在这种情况下,您可以将值存储到某种Dictionary
或NameValueCollection
中。
有多种方法可以实现这一点,我认为这是超出主题的,但是,请注意 键 所有这一切,其实质是简单地解密服务器上的URL(在回发期间)并将未加密的数据保存到会话变量中,如果您想将其从URL中隐藏。
答案 1 :(得分: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中。这使得所有复杂而繁琐的逻辑都被封装起来。