4

動的データで作成された URL を難読化する最良の方法は何ですか?

たとえば、\Products\List.aspx?ProductId=2 は次のようになります。

\Products\List.aspx?x=UHJvZHVjdElkPTI=

ここで、"ProductId=2" は Base 64 でエンコードされ、カジュアルなスヌーピングを防止します

\Products\List.aspx?ProductId=3

\Products\List.aspx?ProductId=4

等...?

おそらく、既存のオブジェクトから継承し、いくつかの関数をオーバーライドする必要があります 問題は、どのオブジェクトとどの関数かです

Metamodel オブジェクトの GetActionPath は興味深いようですが、DynamicRoute "{table}/{Action}.aspx" はどのように関与するのでしょうか...

現在、Asp.net 1.1 サイトでは、次のコードのカスタム実装を使用しています。 http://www.mvps.org/emorcillo/en/code/aspnet/qse.shtml正規表現を使用してすべてのクエリ文字列を書き換え、リフレクションを使用してクエリ文字列コレクションをデコードされた値に変更するのは HTTPModule です。

では、変更に影響を与えるフックはどこにありますか。

4

2 に答える 2

2

私は解決策を見つけました

アドバイスを受けて、DynamicDataRoute を継承する Route を実装しました。

オーバーライドされたメソッドは、GetVirtualPath と GetRouteData です。

これがglobal.asaxページです

 routes.Add(New EncodedDynamicDataRoute("{table}/{action}.aspx") With { _
.Defaults = New RouteValueDictionary(New With {.Action = PageAction.List}), _
.Constraints = New RouteValueDictionary(New With {.Action  "List|Details|Edit|Insert"}), _
.Model = model})

これがエンコードされた DynamicDataRoute です。

Imports System.Web.DynamicData
Imports System.Web.Routing
''' <summary>
''' The purpose of this class to base 64 encode the querystring parameters.
''' It converts the keys to base64 encoded and back.
''' </summary>
Public Class EncodedDynamicDataRoute
Inherits DynamicDataRoute
Public Sub New(ByVal url As String)
    MyBase.New(url)
End Sub

Public Overloads Overrides Function GetRouteData(ByVal httpContext As HttpContextBase) As RouteData
    Dim routeData As RouteData = MyBase.GetRouteData(httpContext)
    If Not (routeData Is Nothing) Then
        DecodeRouteValues(routeData.Values)
    End If
    Return routeData
End Function
Private Sub EncodeRouteValues(ByVal routeValues As RouteValueDictionary)
    Dim tableName As Object
    If Not routeValues.TryGetValue("table", tableName) Then
        Return
    End If
    Dim table As MetaTable
    If Not Model.TryGetTable(DirectCast(tableName, String), table) Then
        Return
    End If
    Dim strOutput As New StringBuilder
    Dim val As Object
    For Each column As MetaColumn In table.PrimaryKeyColumns
        If routeValues.TryGetValue(column.Name, val) Then
            strOutput.Append(column.Name & Chr(254) & val & Chr(255))
            routeValues.Remove(column.Name)
        End If
    Next
    Dim out As String = (Convert.ToBase64String(Encoding.ASCII.GetBytes(strOutput.ToString)))
    If routeValues.ContainsKey("x") Then
        routeValues.Item("x") = out
    Else
        routeValues.Add("x", out)
    End If
End Sub
Public Overloads Overrides Function GetVirtualPath(ByVal requestContext As RequestContext, ByVal values As RouteValueDictionary) As VirtualPathData
    EncodeRouteValues(values)
    Return MyBase.GetVirtualPath(requestContext, values)
End Function
Private Sub DecodeRouteValues(ByVal routeValues As RouteValueDictionary)
    Dim tableName As Object
    If Not routeValues.TryGetValue("table", tableName) Then
        Return
    End If
    Dim table As MetaTable
    If Not Model.TryGetTable(DirectCast(tableName, String), table) Then
        Return
    End If
    Dim enc As New System.Text.ASCIIEncoding()
    Dim val As Object
    If routeValues.TryGetValue("x", val) AndAlso val <> "AAA" Then
        Dim strString As String = enc.GetString(Convert.FromBase64String((val)))
        Dim nameValuePairs As String() = strString.Split(Chr(255))
        Dim col As MetaColumn
        For Each str11 In nameValuePairs
            Dim vals() As String = str11.Split(Chr(254))
            If table.TryGetColumn(vals(0), col) Then
                routeValues.Add(val(0), col)
            End If
        Next
    End If
   End Sub
  End Class
于 2010-04-13T01:22:08.287 に答える
1

これが私がやった方法です:

モジュールに 4 つの関数を作成しました。

public static string EncryptInt(int val)
public static int DecryptInt(string val)
public static string DecryptStr(string str)
public static string EncryptStr(string source)

URLを作成したいときは、次のようにしました。

 string.Format(@"\path\file.aspx?ID={0}&name={1}",encrypt.EncryptInt(inID),encrypt.EncriptStr(inName)); 

結果を取得したいときは、取得したパラメーターで Decrypt 関数を呼び出します。

システムにタイプ セーフのレベルを追加したので、2 つの型を使用しましたが、文字列で 1 つを使用し、必要に応じて int.Parse() を呼び出すこともできます。

これはあなたの質問に答えていますか?

Microsoft の Dynamic Data の場合、フックはテンプレート ページのコード ビハインドにあると思います。

于 2010-03-31T03:10:21.623 に答える