使用 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.
我是 运行 带有 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.