【问题标题】:Can a HTTP GET request on REST web service be safe?REST Web 服务上的 HTTP GET 请求是否安全?
【发布时间】:2019-10-09 11:37:29
【问题描述】:

我目前正在开发一个使用 Django REST Framework 开发的新 REST Web 服务,在定义 URL 时,我怀疑它的安全性。遵循为数据库中的列表数据定义 GET 方法的标准,我不明白这是否是一种安全的数据获取方法。

想象一下这种情况:

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

它的工作原理是这样的:/patients/HASHCODE

由于我的哈希码是 URL 中的请求,而不是 HTTP 消息正文中的请求,就像通过 POST 方法完成的那样,这对我来说看起来不安全。我知道 SSL 可以隐藏一些请求信息,但不能隐藏 GET 请求。当然,这个散列不应该对任何人可见。

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

【问题讨论】:

    标签: rest


    【解决方案1】:

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


    如果你所说的 hash 表示一个访问令牌,那么它属于带有Bearer 身份验证方案的Authorization 标头(参考这个answer详情)。或者,您可能希望使用设置了HttpOnlySecure 标志的cookie

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


    任何类型的敏感信息(例如凭据、访问令牌,你可以命名它)必须永远在 URL 中发送:请求的 URL 可能会被记录服务器和代理;如果浏览器请求 URL,则 URL 会转到浏览器历史记录。你肯定想避免这种情况。

    GET 用于数据检索,而POST 有点catch all 动词,也就是说,payload 中发送的表示将根据资源自己的特定语义进行处理)。如果您需要发送敏感信息到服务器,我建议您使用POST,将任何敏感数据发送到将通过 HTTPS 加密的有效负载中。

    【讨论】:

    • 我还有一个问题:通常在 REST 应用程序中,我们使用 GET 来列出和检索信息。按照您的建议,对于敏感信息,我应该对这些方法使用 POST 吗?
    • @MatheusHernandes 我已经更新了我的答案,详细说明了这一点。
    • 我以为我做错了什么,非常感谢您的帮助。
    • HTTPS 会暴露请求的URL 肯定是错误的;只有IP 被暴露...对于患者信息,甚至还有特定的规定要遵循,例如。 hhs.gov/hipaa/index.html(最好考虑在编写第一行之前迟早审核代码)。
    • @MatheusHernandes on security.stackexchange.com 你可能会得到更多关于在医院环境中应用哪些安全标准的合格答案......“以某种方式工作”可能不够(除非它可能是一个库存系统)对于硬件升级,正如我曾经写过的那样)......由于信息的敏感性,违反 HIPAA(或类似)规定的罚款通常很高。阅读它们一次可能会对决策有很大帮助 - 因为法律框架是唯一重要的框架。
    猜你喜欢
    • 1970-01-01
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 2021-01-17
    • 2016-02-04
    • 1970-01-01
    • 2018-12-19
    相关资源
    最近更新 更多