Скремблирование URL для динамических данных - PullRequest
4 голосов
/ 31 марта 2010

Каков наилучший способ скрыть 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

и т.д ...? * * 1013

Мне, вероятно, придется наследовать от существующего объекта и переопределить некоторую функцию Вопрос в том, какой объект и какая функция

GetActionPath объекта Metamodel кажется интересным, но как DynamicRoute "{table} / {Action} .aspx" играет в нем ...

Прямо сейчас на сайте Asp.net 1.1 я использую пользовательскую реализацию следующего кода. http://www.mvps.org/emorcillo/en/code/aspnet/qse.shtml Это HTTPModule, который использует регулярное выражение для перезаписи всех строк запросов, а также с отражением изменяет коллекцию строк запросов с декодированными значениями.

Так где же крючок, чтобы повлиять на изменение?

Ответы [ 2 ]

2 голосов
/ 13 апреля 2010

Я нашел решение

По совету я реализовал маршрут, который наследуется от 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 голос
/ 31 марта 2010

Вот как я это сделал:

Я создал 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 для извлеченного параметра.

Я использовал два типа, потому что он добавил уровень безопасности типов в систему, но вы могли бы просто использовать один со строками и затем вызывать int.Parse () при необходимости.

Это отвечает на ваш вопрос?

Что касается динамических данных Microsoft, я полагаю, что в коде для шаблонных страниц будут найдены зацепки.

...