Django:只接受来自我的应用程序的请求
Posted
技术标签:
【中文标题】Django:只接受来自我的应用程序的请求【英文标题】:Django: Only accept requests coming from my applications 【发布时间】:2014-05-10 02:37:59 【问题描述】:是否可以只接受来自我的应用程序的请求?例如,我有一个名为“Best App”的 ios 应用程序,它使用 Django 作为其后端。我怎样才能做到只接受来自 Best App 的请求而拒绝其他所有请求?
我正在考虑检查请求中的“HTTP_USER_AGENT”键,如果 HTTP_USER_AGENT 是“最佳应用程序”,我将允许请求通过。但我最近发现,任何人都可以通过 Chrome 等应用程序修改其 USER_AGENT 并请求访问我们的资源。
还有其他方法可以限制对我的特定应用程序的访问吗?我想通过授予白名单访问权限来向其他开发人员开放我的后端服务。但是现在,我想保持对我们后端的私有访问。
非常感谢您对此事的建议和见解。
【问题讨论】:
【参考方案1】:良好的应用程序安全解决方案并非易事。您不能使用任何简单的纯文本对象,例如 HTTP_USER_AGENT。一种常见的方法是“API 密钥”——从注册页面获得的密钥与请求一起提供,但除非您将其与其他一些“秘密”结合起来,否则它可以被“假”轻松复制和提供应用程序。
一个相当强大的解决方案是使用共享密钥的某种形式的挑战/响应。从理论上讲,一个坚定的攻击者可以从您的应用程序中提取您的秘密并使用它,但这需要付出合理的努力——首先他们需要解密您的应用程序包,然后提取秘密。流程类似于 -
-
应用向 Web 服务发送身份验证请求,提供 API 密钥。
Web 服务查找 API 密钥以确定“共享密钥”
Web 服务将质询字符串发送回应用程序
应用程序使用共享密钥对质询字符串进行哈希处理并将其发送回 Web 服务
Web 服务应用相同的哈希并比较答案
如果哈希比较,Web 服务将会话密钥返回给应用程序
应用在所有后续请求中发送会话密钥
在某些时候,您需要使会话密钥无效 - 应用注销、超时、请求数
要保护这种方法免受中间人攻击,您需要通过 SSL 运行它并确保您的应用验证服务器证书。
您还应该针对暴力尝试实施某种形式的保护,例如在“x”个挑战失败后锁定 API 密钥
【讨论】:
你会建议我为他的场景类型实施 OAuth 2.0 吗? 您可以使用 OAuth 对用户进行身份验证并授予他们对您的 API 的访问权限,但无法控制他们是使用您的应用程序还是其他方法。您可以使用 OAuth 来验证您的应用程序的身份,但您的应用程序中实际上会有一个用户名和密码,所以我认为这不是最好的方法以上是关于Django:只接受来自我的应用程序的请求的主要内容,如果未能解决你的问题,请参考以下文章
如何让页面仅在使用 cloudflare 时接受来自我网站的 iframe 请求?
在 Django Rest Framework 中对来自我的网站的 Ajax 请求进行权限绕过