停止对Ajax页面的直接页面调用

时间:2009-11-26 07:18:21

标签: asp.net security

是否有一种“聪明”的方法可以阻止ASP.NET中的直接页面调用? (页面功能,而不是页面本身)

聪明地说,我的意思是不必在页面之间添加哈希来阻止直接调用AJAX页面。简而言之,这会阻止用户访问Ajax页面,而不会以合法的方式来自您的某个网站页面。我知道没有什么是不可能打破的,我只是想看看有什么其他有趣的方法。

如果没有,有没有办法可以在不使用会话/ cookie的情况下做到这一点?

6 个答案:

答案 0 :(得分:4)

看一下这个问题:Differentiating Between an AJAX Call / Browser Request

上述问题的最佳答案是检查请求或自定义标题。

最终,您的Web服务器正在接收客户端发送给您的请求(包括标头) - 所有可以欺骗的数据。如果确定了用户,则任何请求都可能看起来像AJAX请求。

我无法想到一种优雅的方法来阻止这种情况(有一些不优雅的,可能是非完美的方法,你可以在ajax和非ajax请求之间提供某种请求计数器的哈希)。

我可以问为什么你的应用程序对直接调用“ajax”页面如此敏感吗?你可以围绕这个设计吗?

答案 1 :(得分:2)

您可以检查请求标头以查看调用是否由AJAX启动通常,您应该发现x-requested-with具有值XMLHttpRequest。或者在ASP.NET AJAX的情况下,检查ScriptMAnager.IsInAsyncPostBack == true。但是,我不确定是否首先阻止了请求。

答案 2 :(得分:1)

我不认为没有使用会话就可以做到这一点。即使您使用Http标头,也可以让某人使用完全相同的标头创建请求。

使用ASP.NET与Ajax请求的会话很容易。您可能遇到一些问题,例如session expiration,但您应该能够找到解决方案。

通过会话,您将能够保证只有登录用户才能访问Ajax服务。在为Ajax请求提供服务时,只需测试是否存在与之关联的有效会话。当然,登录用户可以直接访问该服务。你无能为力避免这种情况。

如果您担心登录用户可能会尝试直接联系服务以窃取数据,则可以为服务添加时间限制。例如,不允许用户一次访问服务的频率超过一分钟(或者应用程序正常工作所需的其他速率)。

了解Google和亚马逊正在为其网络服务做些什么。它们允许您直接与他们联系(甚至提供API来执行此操作),但他们对您可以提出的请求数量进行限制。

答案 3 :(得分:1)

您是否考虑过标头身份验证?如果您只希望您的应用能够对某些页面进行ajax调用,则可以要求对这些页面进行身份验证...不确定这是否对您有所帮助?

Basic Access Authentication

或更安全的

Digest Access Authentication

另一种选择是在请求页面之前在应用程序中的URL查询字符串中附加某种标识符,并在服务器端使用某种身份验证方法。

答案 4 :(得分:1)

我在PHP中通过声明一个包含在任何地方的文件中的变量来执行此操作,然后检查该变量是否在ajax调用文件中设置。

这样,您无法直接调用该文件,因为该变量永远不会被定义。

答案 5 :(得分:1)

这是“非平凡”的方式,因此它不太优雅。

我能想到的唯一真实想法是跟踪每个链接。 (因为在所有内容中都有回发,然后是response.redirect)。通过这种方式,您可以保留static List<>或某些IP地址(以及可能的浏览器ID等),说明当前允许从该访问者访问哪些页面..以及它们的超时时间和这样可以防止他们在3天后直接进入某个页面。

我建议您重新考虑您的设计,以确保确实需要这样做。并且还注意到IP等可能是欺骗性的。

此外,如果您遵循此路线,请务必阅读有关何时处置静态变量的信息。当他们使用该网站10分钟时,您不会想要其中一个令人讨厌的“您的会话已过期”消息。