使用 pytest 伪造 http-host headers(以及潜在的安全问题)?

Faking http-host headers with pytest (and potential security issues)?

我是 运行 带有 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 测试这个。我可以将 headers 设置为:

 @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

因为我可以很容易地伪造我的 headers 我想这也可以用其他工具轻松完成? MyPermission如何从安全角度进行评估?

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

像这样检查 Host header 没有任何意义,并且不会像您在评论中描述的那样防止第 3 方客户端。攻击者可以创建任意客户端并向您的 API 发送请求,并且该请求可以(并且将会)像任何其他合法请求一样包含正确的 Host header。

另外,根据您的意见,您希望对客户端应用程序进行身份验证,这在技术上是不可能的,因为已讨论过多次。通过一些工作(您可以在一定程度上影响的数量),任何人都可以为您的 API 创建一个不同的客户端,并且没有安全的方法可以防止这种情况发生,因为您在客户端中包含的任何内容都会为用户所知(攻击者),并允许他们复制它。你可以而且可能应该验证你的用户,检查访问模式,实施速率限制,在可疑的情况下撤销用户访问 activity 等等 - 但这都是基于用户身份验证。

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