2012-01-04 97 views
0

我使用下面的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 

我的问题我应该使用不同的方法来提取解码后的查询字符串值,而不是我正在做的事情?预先感谢您的建设性答复。

解决方案

看着达林的回应后,我已决定将其纳入我的项目,这是我更新的代码:

'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

您错误地在第一个位置生成查询字符串。您正在使用字符串连接并且没有正确编码它们。如果_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 

使用URL打交道时,不要使用字符串串联和分裂。始终使用正确的工具来完成正确的工作。

就创建/解析查询字符串而言。就加密/解密值而言,您没有向您显示/告知我们关于您正在使用的类的任何信息,因此我无法向您提供任何关于它的建设性意见。

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

+0

感谢您的回复。 Tools类包含我在OP中引用的链接中找到的两个方法(http://stackoverflow.com/a/1330421/100283)。我想将值存储在数据库中,但我正在使用旧数据库,因此我无法对其进行任何新更改。 – 2012-01-04 20:00:27

+0

好吧,我明白你的意思,但Type只能是五个不同值(Int,Sbj,Veh,Grp和Bus)中的一个,_primaryKey是一个整数值。所以这两个值都不会包含&或= =字符。我会加入你的解决方案,因为它不会受到伤害。 – 2012-01-04 20:29:43