如何防止任意客户端应用程序使用您的匿名Web API?

道歉,如果这已经被问及答复; 我已经看了一大堆,但还没有find我正在问什么。

  1. 假设我在http://example.com/上的 web应用程序使用私有和未公开的Web API( http://api.example.com/)来获取数据,例如通过XHR或JSONP。

  2. 另外假设这个networking应用程序是匿名的 – 它不需要用户login。

  3. 由于客户端和服务器之间有通信,任何人都可以打开Fiddler等来查看确切的请求和响应,更不用说检查客户端的JS代码了。

在这种情况下,如何防止某人在非Web客户端应用程序中使用您的API? 例如iPhone应用程序或服务器端。

据我了解,第二点删除了类似OAuth的选项,第三点删除了例如API密钥甚至SSL的选项。

我曾经想过一些事情,比如基于时间的令牌或者秘密的salt,它们会在第一次加载的时候被注入到页面中,但是一个iPhone应用可以在发出API请求之前偷偷的加载你的网页。

那么除了简单的混淆之外还有什么方法 – 通过默默无闻的安全吗?

如果所有这些都太抽象了,下面是一个简单的例子:

Google.com通过一些私人和无证的API来获取自动完成的数据 – 但是在网上打开。 什么是阻止我在iPhone应用程序中使用它?

您不能阻止人们复制您的客户端代码或重播networkingstream量。

由于相同的来源策略 ,其他networking应用程序无法从客户端访问您的API。 他们将不得不通过服务器代理他们的请求,这意味着这些请求将来自less数容易识别的IP地址,您可以暂时将其列入黑名单。

至于桌面和移动应用程序,你可以做的不多。 我的build议是不要担心他们,直到他们是一个问题。

也就是说,做好准备并没有什么坏处。 如果你想避免昂贵的法律争议,你可以做的一件事是不时更改您的API方法签名。 浸出应用程序可以修复,但其声誉将稳步下降。

身份validation不会防止滥用您的API。 只要客户端可以正确authentication您的系统,他就可以使用他/她select的任何客户端。 只有客户端和服务器都安全且连接安全的情况下才能避免滥用。

如果问题是滥用,那么简单的节stream解决scheme可能就足够了。

如果没有API密钥或某种forms的授权,您将会试图阻止未经授权的客户端进行失败的战斗。

你可以嗅到多个东西,但是最难的事情是很容易被伪造的。

你是否控制其他networking服务? 此外,如果您的Web应用程序( http://example.com/ )通过XHR或JSONP访问API( http://api.example.com/ ),是否可以使用库等代理服务器上的数据cURL获取数据,然后在您的网站上提供。 然后,您可以以任何您认为合适的方式控制对其的访问。

如果你的客户端的代码隐藏在snopers中,你是否可以按照你的build议去做,使用salt,ip地址和基于时间的值,对它们进行encryption,然后在服务器端做同样的事情? 这基本上是mod_auth_tkt所做的,并且运行良好。 或者这将构成authentication?