1

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

请帮忙。

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

谢谢。

4

2 回答 2

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 中。这使所有复杂而乏味的逻辑都被封装起来。

于 2012-06-13T17:29:51.487 回答
1

一种轻松实现此目的的方法是像当前一样解密查询字符串,然后将其值设置为可以存储在会话中的某个对象。如果您想从查询字符串中排除此信息(隐藏),将其存储在会话变量中会很有用——您实际上是在幕后传递数据。

一旦存储在 session 中,您将更改您的代码,这样无论您在哪里使用querystring["var"],您都将引用已存储在 session 中的对象。

编辑

但是请注意,这不必降级为单个值。这个对象可以有多个属性,每个属性代表一个查询字符串值:

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或 a中NameValueCollection

有多种方法可以实现这一点,我认为这超出了主题,但是请注意,所有这一切的关键,本质是简单地解密服务器上的 url(在回发期间)并将未加密的数据保存到会话变量中如果您想从 URL 中隐藏它。

于 2012-06-13T16:00:52.077 回答