【问题标题】:Faking http-host headers with pytest (and potential security issues)?使用 pytest 伪造 http-host 标头(以及潜在的安全问题)?
【发布时间】:2021-05-28 09:53:40
【问题描述】:

我正在运行一个带有 REST API 的 django 应用程序,并且我正在使用自定义权限保护我的 API 端点。它看起来像这样:

class MyPermission(permissions.BasePermission):
    def has_permission(self, request, view):
        host = request.META.get('HTTP_HOST', None)
        return host == "myhost.de"
        )

这个想法是我的 API 只能通过“myhost.de”访问。

现在我正在使用 pytest 进行测试。我可以设置我的标题:

 @pytest.fixture()
    def request_unauth(self, client):
        result = client.get(
            "myurl",
            headers={'HTTP_HOST', 'myhost.de'},
            content_type="application/json",
        )
        return result

   def test_host(request_unauth):
     assert request_unauth.status_code == 200

由于我可以轻松伪造我的标题,我认为这也可以使用其他工具轻松完成?如何从安全角度评估MyPermission

非常感谢您的帮助和提示。非常感谢。

【问题讨论】:

  • 我想出了第一部分:我可以做{"HTTP_HOST", "myhost"}。我会更新我的问题
  • 您可能需要使用https(而不是http)进行测试,因为SSL 证书可能会因为主机标头与证书不匹配而保护您。
  • 这很有帮助,谢谢!你认为我应该在我的许可下也这样做request.META.get('HTTPS_HOST', None)吗?
  • 这种保护的目的是什么?这应该减轻什么威胁?
  • Host 是 Web 服务器选择虚拟主机的目标名称。我认为您的意思是 OriginReferer 标头,但是您想要实现的目标仍然是不可能的,请参阅我的答案。

标签: python django security http-headers pytest


【解决方案1】:

像这样检查 Host 标头没有意义,并且不会像您在 cmets 中描述的那样保护第三方客户端。攻击者可以创建任意客户端并向您的 API 发送请求,并且该请求可以(并且将)包含正确的 Host 标头作为任何其他合法请求。

同样基于您的 cmets,您希望对客户端应用程序进行身份验证,这在技术上是不可能的,因为已经多次讨论过。通过一些工作(您可以影响的数量),任何人都可以为您的 API 创建不同的客户端,并且没有安全的方法可以阻止这种情况,因为您包含在客户端中的任何内容都会被用户(攻击者)知道,并允许他们复制它。不过,您可以并且可能应该对您的用户进行身份验证、检查访问模式、实施速率限制、在出现可疑活动时撤销用户访问权限等等 - 但这一切都基于用户身份验证。

您还可以通过在 API 中发送正确的 CORS 标头(或根本不发送 CORS 标头)来阻止在不同域的标准浏览器中运行的客户端进行访问。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    • 1970-01-01
    • 2011-10-19
    • 2011-01-06
    • 2015-11-14
    • 1970-01-01
    • 2013-01-28
    相关资源
    最近更新 更多