REST Web服务上的HTTP GET请求可以安全吗?

时间:2019-05-22 22:56:42

标签: rest

我目前正在使用Django REST Framework开发的新REST Web服务,在定义URL时,我对其安全性表示怀疑。遵循为数据库中的列表数据定义GET方法的标准,我不知道这是否是携带数据的安全方法。

想象一下这种情况:

我访问定义为返回患者列表的URL /患者。该列表不是公开的,只能由授权用户请求。由于并非所有用户都可以看到所有患者,因此我创建了一个用作密钥的 hash 代码,从而可以列出该特定用户的患者。如果没有提供哈希码,则该方法返回403禁止。

它的工作原理如下: /患者/哈希码

由于我的哈希码是在URL中请求的,而不是在HTTP消息正文中的请求(就像通过POST方法完成的那样),因此这对我来说是不安全的。我知道SSL可以隐藏请求的某些信息,但不能隐藏GET请求的信息。当然,没有人看不到这种哈希。

我可以说这是访问我的API的安全方法吗?如果没有,我应该如何实现呢?

1 个答案:

答案 0 :(得分:3)

首先,您必须使用HTTPS,因为它确保 body headers 都将被加密。选择由证书颁发机构颁发的证书,并远离自签名证书。


如果您所说的 hash 表示访问令牌,则它属于具有hours%12 == 3身份验证方案的Authorization标头(请参阅answer(有关详细信息)。另外,您可能想使用同时设置了cookieHttpOnly标志的Secure

我还建议您研究应用程序的某种授权机制:根据用户角色或权限,检索他们可以访问或拒绝请求的数据。您的Web框架很可能已经为您提供了某种授权机制。我还要强调一点,您不应该编写自己的与安全相关的内容(除非您真的知道自己在做什么)。


任何类型的敏感信息(例如凭据,访问令牌,为您命名)都必须永远通过URL发送:所请求的URL可能由服务器和代理;如果浏览器请求该URL,则该URL进入浏览器历史记录。您一定要避免这种情况。

GET用于数据检索,而POST则是 catch all 动词,也就是说,有效载荷中发送的表示形式将根据资源自身进行处理具体的语义)。如果您需要将敏感信息发送到服务器,我建议您使用POST,发送有效载荷中的所有敏感数据,这些数据将通过HTTPS进行加密。