我正在使用以下链接中描述的方法,并使用以下代码进行加密:
'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
我仍然想加密查询字符串,因为我想防止用户手动更改查询字符串值
标题>首先构建查询字符串是错误的。您正在使用字符串连接,但没有对它们进行正确编码。如果_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时不要使用字符串连接和分割。正确的工作要用正确的工具。
就创建/解析查询字符串而言。就加密/解密值而言,您没有向我们展示/告诉我们您正在使用的Tools
类的任何信息,因此我无法为您提供任何建设性的意见。
您知道最好的加密是永远不要将实际值发送给客户端。你可以将它存储在服务器的后端存储中然后在url中使用唯一id。可以在目标页面上使用这个id来获取原始值。这样你就不需要加密/解密任何东西了