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

问题描述 投票:5回答:4

我有一个使用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屏蔽方法,并且正在寻求提供这样做的机制。

我已经知道了一些执行URL屏蔽的方法,但是想要SO最简单的实现解决方案。

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

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

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

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

我希望这个问题可以导致一个很好的解决方案列表,也许还有我尚未意识到的方法。


编辑

目前情况更明确的问题:

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

我们的想法是使地址栏看起来始终相同。即使是JavaScript破解也是可以接受的。

asp.net iis masking
4个回答
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
投票

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

恕我直言:

  • 如果你说response.redirect是它当前如何满足要求,那么(猜测)似乎说,重定向取决于一些查询值。如果是这样,“隐藏”并不真正起作用 - 我可以简单地提供相同的查询以获得相同的结果(ing)页面(?)。
  • server.transfer相同 - 它在任何情况下都是“可重复的”(所以无论它应该隐藏的是什么,都不是真的被隐藏(除非我完全错过了问题的要点)。
  • 框架集/ iframe等 - 它们不会隐藏任何内容,它很容易找出源页面的位置(例如IE / Chrome / Safari / FF开发人员工具)。
  • url重写/路由:好吧,为了重新编写或路由网址,必须(首先)请求,因此无论应该隐藏什么,都不是(首先)。
  • 客户端(浏览器或浏览器插件)请求总是可以被检查/看到(没有安全措施,可以被篡改)。

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

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

  • 使用Web服务和客户端脚本。您的UI完全由脚本驱动(也称为“单页应用程序”)。您可以以您认为合适的方式为端点添加安全性,以便即使检查客户端请求,也无法通过欺骗来满足端点要求 - 例如“临时代理” - 您的脚本调用代理,代理服务器端,执行验证+请求参数,向端点发出实际请求。由于请求是在后台(服务器端)完成的,因此客户端不知道端点 - 因此无法检查,看不到也不会被篡改。您现在拥有一个基本的HTML“前端”网站,与完成工作的其他网络应用程序完全分开。只有前端网站及其网址是公开的。
  • 实际上与ASP.net Web Forms Postback不同(如果你真的想到它)。单页,UI是基于用户交互驱动的 - 总是只有1个网址。互动 - >处理。结果取决于用户交互,某些要求。一个很好的例子是ASP.Net Web窗体向导控件 - “步骤”不等同于不同的URL。如上所述,实际处理可以在同一个Web应用程序或完全独立的Web应用程序(Web服务)中完成 - 因此您可以将“前端”Web站点与任何处理Web应用程序完全分开(仅限前者的网址是公开的)。
  • 与ASP.Net MVC相同 - 您的控制器会根据某些交互和/或请求限制(例如仅限HttpPost)管理您要呈现的任何View。

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

心连心...


更新:

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

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

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


1
投票

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

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

如果你想操纵现在实现的东西,最好的解决方案是url rewrite。


0
投票

您可以使用ASP.NET 3.5版本中提供的Webforms和MVC Routing功能

这里有一些例子:

   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也更喜欢Routing 4.0

© www.soinside.com 2019 - 2024. All rights reserved.