在asp.net中动态更改查询字符串

时间:2012-06-13 15:34:11

标签: asp.net rest encryption query-string ihttpmodule

我们的客户要求加密URL,因为它在查询字符串中传递值。我们使用了加密并能够加密URL;但是,现有代码在很多地方使用querystring["var"],并且由于加密的URL而失败。因此,在页面加载时,我们将不得不解密URL。如果我使用response.redirect解密并更改查询字符串,则会再次在URL中显示查询字符串,并且可能会被滥用。

请帮忙。

修改 我正在阅读有关RESTfull Web服务的内容。我还没有理解整个概念。我想知道我是否可以在我的应用程序中使用它来隐藏查询字符串。如果有,请告诉我。

感谢。

2 个答案:

答案 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;

现在,它使用属性来表示每个查询字符串值。你可能有很多。在这种情况下,您可以将值存储到某种DictionaryNameValueCollection中。

有多种方法可以实现这一点,我认为这是超出主题的,但是,请注意 所有这一切,其实质是简单地解密服务器上的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中。这使得所有复杂而繁琐的逻辑都被封装起来。