解码加密查询字符串

时间:2012-01-04 13:57:57

标签: asp.net vb.net query-string

我正在使用以下LINK中描述的方法,并且我使用以下代码进行加密:

'Page1.aspx    
Protected Sub butEncrypt_Click(sender As Object, e As EventArgs) Handles butEncrypt.Click
    Dim QueryString As String = "type=Int&pk=" & _primaryKey
    QueryString = Tools.encryptQueryString(QueryString)
    Response.Redirect(/SearchResults.aspx?Val=" & QueryString)
End Sub

然后最后解密:

        'SearchResults.aspx
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If (Not IsPostBack) Then
         If Not String.IsNullOrEmpty(HttpContext.Current.Request(CIAppGlobals.GlobalVar.Val)) Then
            Dim qs As String = Request.QueryString(CIAppGlobals.GlobalVar.Val)
            qs = Tools.decryptQueryString(qs)

            Dim Values As String() = qs.Split(CChar("&"))

            _imageType = String.Empty
            _primaryKey = 0

            For Each value As String In Values
               Dim data As String() = value.Split(CChar("="))

               Select Case data(0).ToUpper
                  Case "TYPE"
                     _imageType = data(1)
                  Case "PK"
                     _primaryKey = CInt(data(1))
               End Select
            Next
            Else
               _imageType = HttpContext.Current.Request("type")
               _primaryKey = CInt(HttpContext.Current.Request("pk"))
         End If
    End If
   End Sub

我的问题是我应该使用不同的方法来提取除我正在做的之外的解码查询字符串值吗?提前感谢您的建设性回应。

解决方案

在查看Darin的回复后,我决定将其纳入我的项目,这是我的更新代码:

'Page1.aspx    
Protected Sub butEncrypt_Click(sender As Object, e As EventArgs) Handles butEncrypt.Click
  Dim query = HttpUtility.ParseQueryString(String.Empty)
  query("type") = "Int"
  query("pk") = CStr(_primaryKey)

  Dim QueryString As String = Tools.encryptQueryString(query.ToString())
  Response.Redirect(/SearchResults.aspx?Val=" & QueryString)
End Sub

我仍然想加密查询字符串,因为我想阻止用户手动更改查询字符串值

1 个答案:

答案 0 :(得分:1)

您首先错误地构建了查询字符串。您正在使用字符串连接而不正确编码它们。如果_primaryKey包含&=个字符,该怎么办?您可以使用ParseQueryString方法正确构建查询字符串:

Dim query = HttpUtility.ParseQueryString(String.Empty)
query("type") = "Int"
query("pk") = _primaryKey
Dim queryString = query.ToString()

可以使用相同的方法解析已解码的查询字符串:

Dim values = HttpUtility.ParseQueryString(qs)
Dim type = query("type")
Dim primaryKey = query("pk")
' work with the type and primaryKey values

在处理网址时,切勿使用字符串连接和拆分。始终使用正确的工具来完成正确的工作。

就创建/解析查询字符串而言。就加密/解密值而言,您没有向我们展示/告诉我们您使用的Tools类的任何内容,因此我无法向您提供任何有关它的建设性意见。

您知道最好的加密方法是永远不会将实际值发送给客户端。因此,您可以将其存储在服务器上的某些后端存储中,然后在URL中使用唯一ID。可以在目标页面上使用此id来获取原始值。这样您就不需要加密/解密任何内容。