5

我有一个使用 IIS 6 和 7 的当前系统,用 ASP.NET 和 .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似乎是一个公平的解决方案,但据我所知,需要对所有查询字符串进行处理,以映射我们需要它们的位置。我不清楚这是否可以隐藏所有页面而不是一对一映射。

使用框架集/iFrames 也不是一种选择,因为它会导致现有解决方案的许多复杂性。

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

我希望这个问题可以提供一个很好的可能解决方案列表,也许还有我还没有意识到的方法。


编辑

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

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

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

4

4 回答 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

于 2012-05-24T12:02:36.070 回答
1

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

恕我直言:

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

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

  • 框架集/iframe 等——它们不隐藏任何东西,找出源页面在哪里(例如 IE/Chrome/Safari/FF 开发者工具)是微不足道的。

  • url 重写/路由:好吧,为了重写或路由 url,必须(首先)请求它,所以应该隐藏的任何东西都不是(首先)。

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

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

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

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

  • 真的和 ASP.net Web Forms Postback 没有什么不同(如果你认真考虑的话)。单页,UI 是基于用户交互驱动的——总是只有 1 个 url。交互 -> 处理。结果取决于用户交互,某些要求。一个很好的例子是 ASP.Net Web 表单向导控件——“步骤”不等同于不同的 url。就像上面一样,实际处理可以在同一个 Web 应用程序或完全独立的 Web 应用程序(Web 服务)中完成 - 因此您可以考虑让“前端”网站与任何处理 Web 应用程序完全分离(仅前者的网址是公开的)。

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

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

嗯...


更新:

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

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

如果我对此想得太多,并且它与 url 中的一些“机密”名称(不是真正的进程)有关,那么 DNS 可能是一个简单的解决方案(CNAME)。

于 2012-05-15T14:36:15.790 回答
1

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

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

如果您想修改现在实施的内容,最好的解决方案是 url 重写。

于 2012-05-25T12:42:56.547 回答
0

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

这里有一些例子:

   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

于 2019-03-19T11:47:50.657 回答