确保托管站点仅使用JavaScript加载MVC3操作

确保托管站点仅使用JavaScript加载MVC3操作,javascript,jquery,asp.net-mvc-3,Javascript,Jquery,Asp.net Mvc 3,我有一个MVC3网页,其中包含一些JavaScript,可以通过jquery load命令将一些内容加载到div中。看起来像这样 $('#divContetn').load('/home/getContent') 在执行其他JavaScript后,在回调时调用此函数。 此代码在页面源代码中可见 我的问题是,有没有办法确保对这个url的调用只来自网页,而不是来自在浏览器中输入url的人 理想情况下,我希望阻止用户从页面源获取此url,然后使用它自己将内容加载到浏览器中 div加载必须从Java

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

 $('#divContetn').load('/home/getContent')
在执行其他JavaScript后,在回调时调用此函数。 此代码在页面源代码中可见

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

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

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

有人对此有什么想法吗?
谢谢

您将永远无法对用户隐藏URL。充其量,您可以增加用户获取URL所需的努力。即使您设法从源代码中隐藏URL(通过JavaScript转义它或者通过AJAX检索URL),用户仍然可以通过使用Fiddler之类的工具找到URL。或浏览器内置的调试工具(如果可用)

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

公共类AjaxOnlyRequestAttribute:ActionMethodSelectorAttribute
{
/// 
///确定操作方法选择对于指定的控制器上下文是否有效。
/// 
///控制器上下文。
///有关操作方法的信息。
/// 
///如果操作方法选择对指定的控制器上下文有效,则为true;否则为false。
/// 
公共覆盖布尔值是有效的请求(ControllerContext ControllerContext,MethodInfo MethodInfo)
{
返回controllerContext.HttpContext.Request.IsAjaxRequest();
}
}

但是,这又增加了用户的工作量。

您可以通过测试
request.IsAjaxRequest()
(请参阅)来检查请求是否可能是通过ajax调用发出的

这将阻止“普通”用户直接访问页面。但是很容易伪造一个包含头的HTTP请求,使您的服务器相信这是一个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();
    }
}