【发布时间】: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 服务器选择虚拟主机的目标名称。我认为您的意思是
Origin和Referer标头,但是您想要实现的目标仍然是不可能的,请参阅我的答案。
标签: python django security http-headers pytest