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

ETC...?

我可能不得不从现有对象继承并覆盖某些功能问题是哪个对象和什么功能

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)

当我想创建一个网址时,我做了这样的事情:

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

当我想得到结果时,我会在检索到的参数上调用 Decrypt 函数。

我使用了两种类型,因为它为系统增加了一定程度的类型安全性,但您可以只使用一种带字符串的类型,然后根据需要调用 int.Parse()。

这回答了你的问题了吗?

对于微软的动态数据,我相信这些钩子可以在模板页面的代码中找到。

于 2010-03-31T03:10:21.623 回答