我目前正在使用Django REST Framework开发的新REST Web服务,在定义URL时,我对其安全性表示怀疑。遵循为数据库中的列表数据定义GET方法的标准,我不知道这是否是携带数据的安全方法。
想象一下这种情况:
我访问定义为返回患者列表的URL /患者。该列表不是公开的,只能由授权用户请求。由于并非所有用户都可以看到所有患者,因此我创建了一个用作密钥的 hash 代码,从而可以列出该特定用户的患者。如果没有提供哈希码,则该方法返回403禁止。
它的工作原理如下: /患者/哈希码
由于我的哈希码是在URL中请求的,而不是在HTTP消息正文中的请求(就像通过POST方法完成的那样),因此这对我来说是不安全的。我知道SSL可以隐藏请求的某些信息,但不能隐藏GET请求的信息。当然,没有人看不到这种哈希。
我可以说这是访问我的API的安全方法吗?如果没有,我应该如何实现呢?
答案 0 :(得分:3)
首先,您必须使用HTTPS,因为它确保 body 和 headers 都将被加密。选择由证书颁发机构颁发的证书,并远离自签名证书。
如果您所说的 hash 表示访问令牌,则它属于具有hours%12 == 3
身份验证方案的Authorization
标头(请参阅answer(有关详细信息)。另外,您可能想使用同时设置了cookie和HttpOnly
标志的Secure
。
我还建议您研究应用程序的某种授权机制:根据用户角色或权限,检索他们可以访问或拒绝请求的数据。您的Web框架很可能已经为您提供了某种授权机制。我还要强调一点,您不应该编写自己的与安全相关的内容(除非您真的知道自己在做什么)。
任何类型的敏感信息(例如凭据,访问令牌,为您命名)都必须永远通过URL发送:所请求的URL可能由服务器和代理;如果浏览器请求该URL,则该URL进入浏览器历史记录。您一定要避免这种情况。
GET
用于数据检索,而POST
则是 catch all 动词,也就是说,有效载荷中发送的表示形式将根据资源自身进行处理具体的语义)。如果您需要将敏感信息发送到服务器,我建议您使用POST
,发送有效载荷中的所有敏感数据,这些数据将通过HTTPS进行加密。