-1

我有一个 MVC3 网页,其中包含一些 JavaScript,可通过 jquery load 命令将一些内容加载到 div 中。看起来像这样...

 $('#divContetn').load('/home/getContent')

在执行其他一些 JavaScript 后,这会在回调中调用。此代码在页面源代码中可见。

我的问题是,有没有办法确保对这个 url 的调用只来自网页,而不是来自自己在浏览器中输入 url 的人?

理想情况下,我想阻止用户从页面源获取此 url,然后使用它自己将内容加载到浏览器中。

由于加载后的回调的性质,必须从 JavaScript 完成 div 加载。

有人对此有任何想法吗?谢谢

4

2 回答 2

1

您将永远无法对用户隐藏 URL。充其量,您可以增加用户获取 URL 所必须付出的努力。即使您设法从源中隐藏 URL(通过使用 JavaScript 转义它或可能通过 AJAX 检索 URL),用户仍然可以通过简单地使用 Fiddler 之类的工具来找出 URL 是什么。或者浏览器内置的调试工具,如果有的话。

通过将此属性放置在操作方法上方,可以在服务器端确保 URL 仅在用户进行 AJAX 调用时可导航:

public class AjaxOnlyRequestAttribute : ActionMethodSelectorAttribute
{
    /// <summary>
    /// Determines whether the action method selection is valid for the specified controller context.
    /// </summary>
    /// <param name="controllerContext">The controller context.</param>
    /// <param name="methodInfo">Information about the action method.</param>
    /// <returns>
    /// true if the action method selection is valid for the specified controller context; otherwise, false.
    /// </returns>
    public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo)
    {
        return controllerContext.HttpContext.Request.IsAjaxRequest();
    }
}

但是,这再次增加了用户必须付出的努力。

于 2013-02-12T11:00:42.503 回答
0

您可以通过测试来检查请求是否可能是通过 ajax 调用发出的Request.IsAjaxRequest()(请参见此处)。

这应该会阻止“普通”用户直接访问该页面。但是很容易伪造一个包含标头的 HTTP 请求,让您的服务器相信它是一个 ajax 请求。

作为一般规则:始终假设客户端请求中的任何内容都可以伪造和操纵。不要相信来自客户的任何东西。特别是不要将任何与安全相关的功能基于任何请求值或浏览器功能(当然,登录凭据和类似功能除外)。

于 2013-02-12T11:00:49.893 回答