1

我们正在开发一个 Ajax 应用程序并使用 jQuery Address 插件来加载应用程序的各个页面所以我们网站的 url 看起来像:www.app.com#/SomeController/SomeAction。导航到这样的 url 会加载应用程序的默认路由,然后使用 jQuery Address 将 SomeController/SomeAction url 加载到页面上的 div 中。

问题是用户仍然可以通过在浏览器中输入 url 直接访问 www.app.com/SomeController/SomeAction(无井号)。我们如何防止用户能够直接访问页面并要求他们在其中具有井号以确保通过 Ajax 请求加载页面?

4

3 回答 3

1

您可以创建一个检查 request.isajaxrequest() 的过滤器。除了默认路由之外,您拒绝任何不是的请求。

我不确定这是否是最好的方法。

于 2011-10-28T15:09:58.633 回答
1

在默认路由之前创建要添加的路由,如下所示:

routes.MapRoute(
    "404 non-hashed",
    "{*fullPath}",
    new { controller = "Error", action = "Show404" },
    new { fullPath = @"^(?!#).+" }
);

此路由将处理任何不以哈希字符开头的请求。任何以哈希字符开头的请求都将失败路由约束,并将继续使用您的默认路由。

创建一个控制器和操作以显示 404 页面或一些自定义错误页面,然后您就设置好了。

于 2011-10-28T16:00:20.423 回答
0

辅导员本是正确的,您可以使用路由技巧来尝试限制合法客户端或应用程序请求特定资源的方式,但您将永远无法保护自己免受伪造(使用提琴手或其他工具)。辅导员本提出的方法仅对潜在地避免用户混淆和限制应用程序的“API”区域有用。当然,您实际上不应该拥有仅依赖 # 深层链接的应用程序,因为这会导致 SEO 等问题。但这是一个不同的讨论。

另一种方法,而不是过滤器,您可以将以下内容添加到您的操作方法中

if (this.HttpContext.Request.IsAjaxRequest() != true)
            return RedirectToAction("Index");

这里的标准做法是给锚一个空的或虚拟的 href 属性并让点击事件执行 AJAX 回调?这样,如果用户复制超链接,他就会自动获得正确的 URL。

于 2011-11-01T02:34:06.613 回答