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

时间:2013-02-12 10:51:41

标签: javascript jquery asp.net-mvc-3

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

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

在执行其他JavaScript之后,在回调时调用此方法。 此代码在页面源中可见。

我的问题是,有没有办法确保对此网址的调用仅来自网页,而不是来自在浏览器中输入网址的人?

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

div加载必须从JavaScript完成,因为它后面加载了回调的性质。

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

2 个答案:

答案 0 :(得分:1)

您永远无法隐藏用户的网址。充其量,您可以增加用户为获取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();
    }
}

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

答案 1 :(得分:0)

您可以通过测试Request.IsAjaxRequest()来检查请求是否可能使用ajax调用(请参阅here)。

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

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