2009-11-26 68 views
2

是否有一种“聪明”的方式来停止ASP.NET中的直接页面调用? (页面功能,而不是页面本身)停止直接页面调用到Ajax页面

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

如果没有,有没有什么办法可以做到这一点,而不使用会话/ cookies?

+0

不可能阻止用户直接访问页面,但仍然允许浏览器访问它。恶意用户总是可以欺骗浏览器正在做的事情。你试图通过停止直接页面调用来防止什么? – 2009-12-07 06:38:50

+0

页面功能,而不是页面本身。加大难度并不是不可能的,这与加密完全相同。你让生活变得如此艰难,以至于更多的努力挣脱,而不是值得。我已经在做一些事情,但这就是为什么我在问其他技巧。我将快速编辑以显示“页面功能”。 – 2009-12-07 07:22:08

回答

4

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

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

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

我不能想到一个优雅的方法来防止这种情况(有不雅的方法,可能是非完美的方法,因此您提供了某种请求计数器在ajax和非ajax请求之间的散列)。

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

+0

谢谢catchdave。我之所以接受MikeB的理由是为了完全说明这是如何完成的。似乎阻止人们做这件事的方式并不多,我怀疑这种做法,但这至少是另一种威慑力。 – 2009-12-08 05:05:25

2

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

+0

你不能欺骗那个头文件吗? – 2009-11-26 09:43:59

+0

是的。 http://stackoverflow.com/questions/623299/can-the-x-requested-with-http-header-be-spoofed – 2009-11-26 11:28:29

+0

想到了,嘿嘿。但感谢您的答案。 – 2009-11-26 11:34:54

1

我不认为有没有办法不使用会话。即使您使用Http标头,对于有人使用完全相同的标头创建请求也是微不足道的。

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

通过会话,您将能够保证只有登录用户才能访问Ajax服务。在处理Ajax请求时,只需测试是否存在与其相关的有效会话。当然,登录的用户将能够直接访问该服务。没有办法避免这种情况。

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

看看谷歌和亚马逊在为他们的网络服务做些什么。他们允许你直接与他们联系(甚至提供API来做到这一点),但是他们会限制你可以提出多少请求。

1

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

Basic Access Authentication

或更安全的

Digest Access Authentication

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

1

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

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

+0

我认为你误解了这个问题。 你的建议是阻止某人直接直接浏览到一个通过HTTP可见的文件,但是只有在包含它时才需要处理的文件(作为一种旁观方式 - 更好的方法是简单地将“包含”文件放在Web服务器范围之外全部一起)。 这里的问题是要求如何阻止某人通过浏览器中的标准方法查看页面,而不是通过AJAX调用请求相同的URL(即:XmlHttpRequest等)。 – catchdave 2009-12-07 06:10:46

+0

这就是我正在谈论的。您无法查看检查直接在包含文件中声明的变量的文件。尝试一下。做一个索引,声明变量。包含另一个文件。检查包含的文件中是否存在该变量。 – 2009-12-07 15:08:52

+0

当然不是(假设register_globals已关闭)。但是在那种情况下,同一个文件将无法通过AJAX直接调用(这是提问者希望能够做到的)。 – catchdave 2009-12-07 22:07:18

1

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

我能想到的唯一真正的想法是跟踪每一个环节。 (就像所有的事情都是一个回传,然后是一个response.redirect)。通过这种方式,您可以保留一个static List<>或IP地址(以及可能的浏览器ID等),以表明哪些页面被允许从该访问者那里访问..以及为了让他们等待的时间从现在开始直到3天。

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

此外,如果你遵循这条路线,一定要阅读有关什么时候静态变量处置等。当他们使用该站点10分钟时,你不会希望那些恼人的“你的会话已过期”消息。