4

什么是混淆的动态数据建立的网址的最佳方法是什么?扰网址动态数据

例如\产品\ List.aspx?产品编号= 2可能成为

\产品\ List.aspx X = UHJvZHVjdElkPTI =

其中 “产品编号= 2” 是编码的以防止偶然窃取基部64在

\产品\ List.aspx?产品编号= 3

\产品\ List.aspx?产品编号= 4

等..?

我可能不得不从现有对象继承,并覆盖某些功能 的问题是哪些对象,哪些功能

元模型对象的GetActionPath似乎有趣, 但如何DynamicRoute“{表}/{}行动.ASPX”发挥到它...

眼下在Asp.net 1.1网站,我使用下面的代码的自定义实现。 http://www.mvps.org/emorcillo/en/code/aspnet/qse.shtml这是HTTP模块,使用正则表达式重写所有查询字符串,并与反射改变QueryString集合与解码值。

那么,是钩影响的变化。

+0

你在问什么 - 你正在使用HTTPModule作为钩子。你想抛弃它并在别的地方做,或者你想改变加密查询字符串的方式吗? – Hogan 2010-03-31 02:54:18

+0

HTTPModule可以工作,但永远不会信任它用于检测查询字符串的正则表达式。我想要一种方式在动态数据网站上进行更改,以便URLS不会被猜测。在动态网站中,所有的网址都是“幕后”生成的。我需要找到一种方式来做出改变...做了一些阅读后,它看起来像我将不得不继承DynamicDataRoute,我想..... – ggonsalv 2010-03-31 03:14:02

+0

嗯动态数据看起来像MVC网址的另一个名称。所以你的例子不应该是/ Products/List/3而不是/Products/List.aspx?ProductID=3? – Hogan 2010-03-31 03:22:38

回答

2

我已经找到了解决办法

咨询,我实现了一个路线从DynamicDataRoute继承。

覆盖其方法是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 
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)); 

当我想要得到的结果我想呼吁检索PARAM解密函数。

我用了两个类型,因为它增加了类型安全系统的水平,但你可以只使用一个用绳子,然后调用int.Parse()需要。

这是回答您的问题吗?

对于微软的动态数据,我相信挂钩将在后面的代码为模板页。

+0

这里是链接到一个样品 http://mattberseth.com/blog/2008/08/aspnet_dynamic_data_simple_5_t.html unfotrunately我无法找到一个现场演示 – ggonsalv 2010-03-31 03:19:33

+0

当然这也适用于这个系统,你只需编辑页面模板来加密和解密每当他们寻找/访问一个ID。 – Hogan 2010-03-31 03:37:34

+0

不幸的是,创建URL的代码隐藏在元模型对象的GetActionPath的后面。我仍然不清楚参数是如何附加到字符串以创建整个URL的。 – ggonsalv 2010-03-31 03:52:33