如何检测 url 是否在 .aspx 之后有文本,以检查加密的 url 查询字符串

How to detect if the url has text after .aspx, to check an encrypted url query string

我有一个网络应用程序可以加密给定信息并将其发送到另一个 .aspx 页面进行处理。但是,有时 URL 可以没有任何参数。它有一个推荐字符串。

例如,如果推荐有效,URL 将类似于:

page.aspx??71FLgNVxFzZBuWxWfefSQPqV/1CaPVg71H4lNFVHm9G8VLO1x2er8Q==

但如果没有推荐,它将是:

page.aspx

这是我的代码:

 Protected Sub Page_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    If Not IsPostBack Then
        Dim strReq As String = ""
        strReq = Request.RawUrl
        strReq = strReq.Substring(strReq.IndexOf("?"c) + 1)

        If Not strReq.Equals("") Then
            strReq = DecryptQueryString(strReq)


            Dim arrMsgs As String() = strReq.Split("&"c)
            Dim arrIndMsg As String()
            Dim strRefId As String = "", strYear As String = "", strMonth As String = ""
            arrIndMsg = arrMsgs(0).Split("="c)

            strRefId = arrIndMsg(1).ToString().Trim()
            arrIndMsg = arrMsgs(1).Split("="c)

            strYear = arrIndMsg(1).ToString().Trim()
            arrIndMsg = arrMsgs(2).Split("="c)

            strMonth = arrIndMsg(1).ToString().Trim()

            resultadoLiteral.Text = "Hay referido: " & strRefId & " " & strYear & "-" & strMonth
        Else
            Response.Redirect("prueba1.aspx")
        End If
    End If
End Sub

Private Function DecryptQueryString(strQueryString As String) As String
    Dim objEDQueryString As New EncryptDecryptQueryString()
    Return objEDQueryString.Decrypt(strQueryString, "r0b1nr0y")
End Function

当 URL 在“?”之后附加了参数时,它工作得很好,但是如果 URL 变得干净,我会在这一行中得到一个错误 "Index was outside the bounds of the array." :

strRefId = arrIndMsg(1).ToString().Trim()

如何检查 url 是否带有参数,例如

If Request.RawUrl IsNot Nothing Then
'Code for decrypt'
Else
results.Text = "There are no parameteres"
End If

谢谢!

罗恩,

我已经根据您的建议更改了代码: Protected Sub Page_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    If Not IsPostBack Then
        Dim strReq As String = ""
        strReq = Request.RawUrl
        strReq = strReq.Substring(strReq.IndexOf("?"c) + 1)

        If strReq.IndexOf("?"c) >= 0 And Not strReq.Equals("") Then
            strReq = DecryptQueryString(strReq)


            Dim arrMsgs As String() = strReq.Split("&"c)
            Dim arrIndMsg As String()
            Dim strRefId As String = ""
            arrIndMsg = arrMsgs(0).Split("="c)

            strRefId = arrIndMsg(1).ToString().Trim()

            resultadoLiteral.Text = "Referal Id: " & strRefId 
        Else
            resultadoLiteral.Text = "There is no referal Id on URL"
        End If
    End If

End Sub

但是在执行代码的时候,如果URL有加密的参数,就可以正常工作。但是当 URL 变干净时,我会得到这个错误:

Index was outside the bounds of the array.

Excalty 在第 37 行:

strRefId = arrIndMsg(1).ToString().Trim()

我是不是漏了什么?

你只需要修改你的代码,这样如果 strReq.IndexOf("?"c) return 一个值小于 0 那么不执行你的解密代码。当此值 < 0 时,表示 url 中没有 ?

例如,您可以更改此行

  If Not strReq.Equals("") Then

至此

 If strReq.IndexOf("?"c) >= 0 And Not strReq.Equals("") Then

我针对此问题尝试了不同的解决方法,检查 url 是否在“.aspx”之后附加了任何字符串。这是我的新代码:

If Not IsPostBack Then

        Dim requestUrl As Uri = HttpContext.Current.Request.Url
        Dim newUrl As New UriBuilder(requestUrl.Scheme, requestUrl.Host, requestUrl.Port, HttpContext.Current.Request.ApplicationPath)
        Dim currentQuery As String = requestUrl.Query

        If String.IsNullOrEmpty(currentQuery) Then
            resultadoLiteral.Text = "No hay parámetros"
        Else

            Dim strReq As String = ""
            strReq = Request.RawUrl
            strReq = strReq.Substring(strReq.IndexOf("?"c) + 1)

            strReq = DecryptQueryString(strReq)


            Dim arrMsgs As String() = strReq.Split("&"c)
            Dim arrIndMsg As String()
            Dim strRefId As String = ""
            arrIndMsg = arrMsgs(0).Split("="c)

            strRefId = arrIndMsg(1).ToString().Trim()


            resultadoLiteral.Text = "Hay referido: " & strRefId
        End If

    End If

使用 currentQuery 我能够检查 URL 并通过操作!

感谢@Ron C 给我必要的提示!