我有一个带有 JSONP API 的 Web 应用程序,我正在与我的 iPhone 应用程序一起使用。我如何确保这一点,以便来自其他地方的请求将无法访问我的 API?
澄清:我的数据并不那么重要。您甚至无需登录即可查看。我只是不想让我的数据库处理来自其他来源的查询。
你已经开始研究一个非常非常复杂的主题。准备好在漫长的夜晚阅读各种保护应用程序的猫鼠技术。我认为最好的选择是在每个请求的标头中放置一个秘密字符串。像这样的东西:
秘密标头:#$F@FQAFDSFE#$%#ADSF())*
在服务器端验证该标头并使用 SSL。有人可以很容易地回复这篇文章“好吧,这并不能阻止这个,这个和这个”,他们是对的。问题是,您的银行是否担心有人耗尽您客户的账户?或者你只是担心 99.9999% 的人不愿意劫持你的垃圾?
有些人对此有各种各样的看法,但如果您的用户需要身份验证才能访问 Web 服务,只需要求通过 SSL 在标头中发送用户名和密码即可。他们仍然可以劫持您的服务,但无法看到任何他们不应该看到的内容。但这仅适用于用户级别的设置类型。如果是完全公开的,你就得考虑你的数据有多么不重要。它可能没有你想象的那么重要。
您可以在 iPhone 客户端中嵌入 RSA 私钥,并随每个请求发送签名时间戳。
服务器将根据公钥验证时间戳并拒绝未签名的请求。
敌人可以拆解iPhone客户端并窃取密钥,而你却无能为力。
(黑名单军备竞赛除外)
您可以使用带有客户端证书的 TLS 协议。 http://en.wikipedia.org/wiki/Transport_Layer_Security
此解决方案的唯一问题(今天尚未解决)是客户端证书存储在应用程序二进制文件中,并且可以进行逆向工程。
执行此操作的一种传统方法是获取您请求的所有 url 变量,添加一个“秘密”字符串,并对整个内容进行散列并将其添加为附加 url 变量。在 API 方面,您执行相同的操作,如果哈希值与您给出的值匹配,则它可能来自您的应用程序。