现有ASP.NET 4解决方案中的高效URL屏蔽/ cloacking /隐藏

时间:2012-05-15 12:54:26

标签: asp.net iis masking

我有一个使用IIS 6和7的当前系统,用.NET 4中的C#编写。

  

我的目的是完全隐藏网址(根据客户要求)。即   https://myapp.it.mydomain.com/Secure/folder1/folder2/folder3/someView.aspx   必须是https://myapp.it.mydomain.com/或至少是不正确的非   更改页面:https://myapp.it.mydomain.com/constantView.aspx

目前,我们对所有导航项目和一些直接链接使用Response.Redirect。 我们也有一些次要的查询字符串用法,但更依赖于跨页回发。 我们没有任何URL屏蔽方法,并且正在寻求提供这样做的机制。

我已经知道了一些执行网址屏蔽的方法,但我们希望在最简单的解决方案中获得SO的意见。

最简单,指的是实施的时间。 即更改我们的调用以独占使用Server.Transfer不是一种选择。

ASP.NET Routing似乎是一个公平的解决方案,但需要按照我的理解处理所有查询字符串,以映射我们需要的地方。我不清楚这是否可以为所有页​​面提供隐藏而不是一对一的映射。

使用framesets / iFrames也不是一种选择,因为它会导致现有解决方案出现许多复杂情况。

据我了解,URL Rewrite Module可能是我最好的解决方案。

我希望这个问题可以提供一个很好的解决方案清单,也许还有我尚未意识到的方法。


修改

目前情况的一个更明确的问题:

我们正在使用IIS 6(因此IIS 7重写模块是不可能的)。 有没有办法提供URL隐藏/屏蔽,这不会破坏使用Page.Referrer(在ASP.NET中)和查询字符串的现有代码?

这个想法是让地址栏看起来总是一样的。 即使是JavaScript破解也是可以接受的。

4 个答案:

答案 0 :(得分:2)

您在此处对所有可能的解决方案进行了优秀细分:http://weblogs.asp.net/scottgu/archive/2007/02/26/tip-trick-url-rewriting-with-asp-net.aspx

但根据您的要求,我个人认为URL重写是您最好的选择,因为您只需要在web.config文件中添加重写规则,因此它是最容易实现的解决方案。对于IIS6,我自己过去使用过Intelligencia UrlRewriter.NET

答案 1 :(得分:1)

有点不清楚......我打算使用评论,但这个“评论”的长度不会...

IMHO:

  • 如果您说response.redirect是当前满足要求的,那么(猜测)似乎说,重定向取决于某些查询值。如果是这样,“隐藏”并不真正起作用 - 我可以简单地提供相同的查询以获得相同的结果(ing)页面(?)。

  • server.transfer相同 - 在任何情况下都是“可重复的”(所以无论它应该隐藏的是什么,都不是真的被隐藏(除非我完全错过了问题的要点)

  • 框架集/ iframe等 - 它们不会隐藏任何内容,它很容易找出源页面的位置(例如IE / Chrome / Safari / FF开发人员工具)。

  • url重写/路由:好吧,为了重新编写或路由网址,必须(首先)请求,因此无论应该隐藏什么,都不是(在第一个地点)。

  • 客户的(浏览器或浏览器插件)请求可以始终进行检查/查看(并且没有安全措施,可以被篡改)。

如果您解释了需要隐藏的内容以及原因,也许会更好。网址只是'某事'的资源 - 所以看来你真的需要保护'某事',而不是真正的url本身(?)。你可能会得到更好的建议......

一些想法(“简单”是相对的):

  • 使用Web服务和客户端脚本。您的UI完全由脚本驱动(也称为“单页应用程序”)。您可以以您认为合适的方式为端点添加安全性,这样即使检查客户端请求,也无法通过欺骗来满足端点要求 - 例如“临时代理” - 您的脚本调用代理,代理服务器端,执行验证+请求参数,向端点发出实际请求。由于请求是在后台(服务器端)完成的,因此客户端不了解端点 - 因此无法检查,看不到也不会被篡改。您现在拥有一个基本的HTML“前端”网站,与完成工作的其他网络应用程序完全分开。只有前端网站及其网址是公开的。

  • 与ASP.net Web Forms Postback完全不同(如果你真的想到它)。单页,UI是基于用户交互驱动的 - 总是只有1个网址。互动 - >处理。结果取决于用户交互,某些要求。一个很好的例子是ASP.Net Web窗体向导控件 - “步骤”不等同于不同的URL。如上所述,实际处理可以在同一个Web应用程序或完全独立的Web应用程序(Web服务)中完成 - 因此您可以考虑将“前端”Web站点与任何处理Web应用程序完全分开(仅限前者的网址是公开的。

  • 与ASP.Net MVC相同 - 您的控制器会根据某些交互和/或请求限制(例如仅限HttpPost)管理您要呈现的任何视图。

尽管如此,以上所有内容都没有通过“不可重复”的测试而不添加更多内容 - 例如RECAPTCHA,您应该问自己是否适合所有用户。在某些时候,如果它不是“公开”,那么认证就成了答案。

... H个


更新

嗯 - 谁知道为什么人们投票并且无话可说:)

无论如何,并非没有更好地理解 真正受到保护。如果必须隐藏URI,那么2层结构 - (1)前端,(2)后端是我个人的选择。这可能意味着Web服务架构。

如果我过度思考这个问题,并且它是网址中某个“机密”名称的问题(不是真正的流程),那么DNS可能是一个简单的解决方案(CNAME)。

答案 2 :(得分:1)

Server.Transfer是您维护相同网址的最佳方式,但在您的情况下,它不是一个选项。 另一种方法是在主页面中加载动态用户控件。

通过动态用户控制,您可以控制您想要在页面中显示的内容,但我认为这是您所拥有的内容的突破性解决方案。网址重写和路由,你将有不同的网址,你将不会保持相同的网址。考虑到你想从url输入页面。 在.net路由中,url必须是唯一的,禁止两个具有相同url的路由。

如果您想要处理现在实现的内容,最好的解决方案是url rewrite。

答案 3 :(得分:0)

您可以使用Webforms和MVC路由功能,该功能可从ASP.NET 3.5版本获得

这里有一些例子:

   Void RegisterRoutes(RouteCollection routes)
    {
          Routes.MapPageRoute(
                          “product-browse”,      // route name
                          “products/{category}”, // URL with params
                          “~/Products.apsx”      // Web forms page to handle it
                             );
    }

    Void Application_Start()
    {
        Registerroutes(RouteTable.Routes);
        RouteTable.Routes.MapPageRoute("Product", "Product/{Name}", "~/Product.aspx"
        // or simply
        routes.MapPageRoute("Customers", "Customers", "~/Customers.aspx");
        routes.MapPageRoute("CustomerDetails", "Customers/{CustomerId}", "~/CustomerDetails.aspx");

    }

// here how you can get url
string url =  Page.GetRouteUrl(“product-browse”, new { category = “software”});
string name = Page.RouteData.Values["name"].ToString();

// This some webform aspx syntax of use:
<asp:HyperLink ID="hyper" runat="server"NavigateUrl='<%# "Product/laptop"%>'  Text='<%# Bind("ProdctName") %>' ></asp:HyperLink>

<img src="<%= Page.ResolveUrl("Styles/Images/Product.jpg") %>" height="65px" width="65px" />

 <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false">
    <Columns>
        <asp:BoundField DataField="Id" HeaderText="Id" ItemStyle-Width="30" />
        <asp:BoundField DataField="Name" HeaderText="Name" ItemStyle-Width="150" />
        <asp:BoundField DataField="Country" HeaderText="Country" ItemStyle-Width="150" />
        <asp:HyperLinkField Text = "View" DataNavigateUrlFormatString = "~/Customers/{0}" DataNavigateUrlFields = "Id" />
    </Columns>
    </asp:GridView>

请勿使用UrlRewriter.NET。这是旧技术。 MVC也更喜欢路由4.0

相关问题