2014-03-30 51 views
1

是否可以只接受来自我的应用程序的请求?举例来说,我有一个叫做'Best App'的iOS应用程序,它使用Django作为它的后端。我该如何做到这一点,只有来自Best App的请求才被接受,其他所有内容都被拒绝?Django:只接受来自我的应用程序的请求

我正在考虑检查请求中的'HTTP_USER_AGENT'键,如果HTTP_USER_AGENT是'最佳应用',我将允许请求通过。但我最近发现,任何人都可以从Chrome等应用程序修改其USER_AGENT,并请求访问我们的资源。

是否有任何其他方式可以限制只访问我的特定应用程序?我想通过提供白名单访问权限来向其他开发者开放我的后端服务。但现在,我想继续访问我们的后端私人。

您对此事的建议和见解非常感谢。

回答

6

良好的应用程序安全解决方案不是微不足道的。您不能使用任何简单的纯文本对象,如HTTP_USER_AGENT。一种常见的方法是“API密钥” - 从注册页面获得的密钥与请求一起提供,但除非将其与其他“秘密”结合使用,否则可以将其简单复制并由“假”应用程序。

一个合理强大的解决方案将是使用共享密钥的某种形式的质询/响应。理论上,一个坚定的攻击者可以从你的应用中提取你的秘密并使用它,但这需要合理的努力 - 首先他们需要解密你的应用包,然后提取秘密。流程类似于 -

  1. 应用程序向Web服务发送请求以进行身份​​验证,提供API密钥。
  2. Web服务查找API密钥,以确定“共享密钥”
  3. Web服务将挑战字符串返回到应用
  4. 应用程序中使用共享密钥散列挑战字符串,并将其发送回Web服务
  5. Web服务应用相同的散列和比较回答
  6. 如果哈希值比较,Web服务将返回会话密钥到App
  7. 应用程序发送的会话密钥的所有后续请求
  8. 在某些时候,你需要无效会话密钥 - 无论是pp注销,超时,请求数量

要保护此方法免受中间人攻击,您需要通过SSL运行它并确保您的应用验证服务器证书。

您还应该实施某种形式的防范暴力破解的措施,比如在'x'失败后锁定API密钥

+0

谢谢!这是我正在寻找的答案。 – noahandthewhale

+0

哎呦!差点忘了!再次感谢! – noahandthewhale

+0

你会建议我为他的类型的场景实现OAuth 2.0吗? – noahandthewhale

相关问题