使用API​​来代表用户将来自网站的请求解释为攻击

时间:2013-10-03 19:11:55

标签: c# asp.net .net web-services http

我正在创建一个使用第三方API(Web服务)作为数据源的ASP.NET MVC网站。它是只读的,到目前为止,个人使用桌面应用程序(大多数使用C#)访问它。我想使用网站来使用此API,以便集中信息并为用户提供历史信息,自动执行某些重复性任务,以及更轻松地允许用户之间共享信息。

今天的桌面客户端会受到限制,如果您使用客户端向API重复请求,您的IP将受到限制和/或禁止。我认为,如果我从我的网站向API发出请求,那么当它看到任何重大用途时,它的IP就会被禁止。

我们假设我无法与API所有者合作。解决此问题的最简单方法可能是使用AJAX进行所有API访问。当用户访问网站时,他使用AJAX向API发出请求然后转身并将其发布到我的网站。我不喜欢这个想法有多种原因 - 首先,它会很慢,其次,我无法保证发送到我网站的数据是真实的。无论出于何种原因,恶意用户都可能向我发送不良信息。

所以我认为更好的想法是建立一个中间人。用户仍然会被迫发出AJAX请求,但他们会将其转发给我控制的代理或其他东西,然后将其转发到真正的API并拦​​截响应,这样我就可以更加确定我检索的数据是真实的。

是否可以创建这样的“代理”?它会带来什么?我想使用.NET技术来实现它,但我对任何想法都持开放态度。

编辑:似乎我使用“代理”这个词引起了混乱。我不想要代理,我想要的是一个允许我拦截来自API的响应的传递。我可以让客户端发出请求,然后上传它,但我不想信任客户端,我想信任API。

让我以较短的形式解释一下。用户的计算机上有一个客户端可以向API发出请求以获取当前信息。我想创建一个做同样事情的网站,但我正在考虑API网络服务可能会注意到,虽然之前它正在接收来自10个不同IP的10个用户的10个请求,但它现在收到10个请求10个来自一个IP的用户并阻止IP将其视为机器人,即使每个请求都像以前一样被用户请求启动。解决此问题的最简单方法是让用户发出请求,然后将响应上传给我,但如果我这样做,我将被迫盲目接受来自客户的数据,这对于任何情况下的任何网站都是一个巨大的禁忌。如果相反,我可以放置一些东西,将请求转发到保留用户IP的API,但也能够拦截响应,从而证明数据是权威的,这是首选。但是,我无法想到这样做的软件机制 - 似乎需要在不同的层进行。

至于法律方面的问题,这是一个广泛使用的API,包含许多应用程序和用户(还有我发现使用API​​的其他网站),但我无法找到任何法律信息,例如论坛帖子之外的服务条款API的技术支持部分相当于“不要重复请求,遵守我们的缓存说明”等。我找不到任何表明这是非法或不正确使用Web服务的内容。

1 个答案:

答案 0 :(得分:1)

您可以实施代理。它不需要是AJAX,它可能只是一个普通的网页请求,如果你想要显示API结果。

无论哪种方式,在.Net中你都可以使用ASP.Net MVC来实现。如果您想要AJAX,请使用实现源API的Web API控制器操作,如果您需要网页,只需使用常规MVC控制器/操作。

在您的控制器中,您只需向源发出Web请求,并传递参数。

为了避免限制,您可以缓存您从服务器发出的每个请求的结果(使用普通的ASP.Net缓存),这样如果另一个客户端尝试发出相同的请求,或者类似的请求,您可以返回缓存的结果,而不是向API发出另一个请求。

您必须确定缓存结果的时间长短,具体取决于客户端数据的最新状态。例如。对于天气数据,缓存一小时似乎没问题。对于更快速移动的数据,它必须更少。你必须在避免限制和保持数据新鲜之间取得平衡。

您还可以智能地获取比每次请求所需的数据更多的数据,然后过滤返回到客户端的结果集。这可以为您提供更好的缓存命中率。