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

时间:2011-03-17 00:16:19

标签: security api web-applications

如果已经被问到并回答了道歉;我环顾四周但却找不到我要问的内容。

-

  1. 假设http://example.com/上的我的网络应用程序使用http://api.example.com/上的私有和未记录的网络API来获取数据,例如通过XHR或JSONP。

  2. 此外,假设此网络应用程序是匿名的 - 要求用户登录。

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

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

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

    我已经考虑过在第一次加载时注入页面的基于时间的令牌或秘密盐,但iPhone应用程序可能很容易在发出API请求之前秘密加载您的网页。

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

    -

    如果一切都过于抽象,这里有一个简单的例子:

    Google.com通过某些私有且未记录的API获取其自动完成数据,但在网络上打开。什么阻止我在我的iPhone应用程序中使用它?

4 个答案:

答案 0 :(得分:23)

您无法阻止人们复制客户端代码或重播网络流量。

感谢same origin policy,其他网络应用无法从客户端访问您的API。他们必须通过服务器代理他们的请求,这意味着这些请求将来自一些易于识别的IP地址,您可以暂时将其列入黑名单。

对于桌面和移动应用程序,您无能为力。我的建议是在问题出现之前不要担心它们。

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

答案 1 :(得分:4)

身份验证不会阻止滥用您的API。只要客户端可以正确地对您的系统进行身份验证,他就可以使用他/她选择的任何客户端。只有客户端和服务器都安全并且连接安全的情况才能避免滥用。

如果问题是滥用,那么简单的限制解决方案可能就足够了。

答案 2 :(得分:2)

如果没有API密钥或某种形式的授权,您将面临失败的战斗,试图阻止未经授权的客户离开您的服务。

你可以嗅到多种东西,但很多事情很容易被伪造。

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

答案 3 :(得分:2)

如果您的客户端具有隐藏在窥探者中的代码,您是否可以按照建议进行操作,使用salt,ip address和基于时间的值,加密它们然后在服务器端执行相同的操作?这基本上就是mod_auth_tkt所做的,而且效果很好。或者这会构成身份验证吗?