Skip to content

Commit d6ffcd7

Browse files
wxg0103liuruibin
authored andcommitted
fix: validate and replace hostname with resolved IP in request URL
1 parent ee87efd commit d6ffcd7

1 file changed

Lines changed: 16 additions & 8 deletions

File tree

apps/oss/serializers/file.py

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -176,14 +176,22 @@ class SafeHTTPAdapter(HTTPAdapter):
176176
"""
177177

178178
def send(self, request, **kwargs):
179-
# 解析 URL 获取主机名
180-
parsed_url = urlparse(request.url)
181-
host = parsed_url.hostname
182-
183-
if host:
184-
# 验证目标 IP 是否安全
185-
self._validate_host_ip(host)
186-
179+
parsed = urlparse(request.url)
180+
host = parsed.hostname
181+
port = parsed.port or (443 if parsed.scheme == 'https' else 80)
182+
183+
# Resolve ONCE
184+
addr_infos = socket.getaddrinfo(host, port, socket.AF_INET, socket.SOCK_STREAM)
185+
validated_ip = None
186+
for info in addr_infos:
187+
ip = info[4][0]
188+
if self._is_unsafe_ip(ip):
189+
raise ValueError(f"Blocked: {ip}")
190+
validated_ip = ip
191+
192+
# PIN: replace hostname with validated IP in the URL
193+
request.url = request.url.replace(f"//{host}", f"//{validated_ip}", 1)
194+
request.headers['Host'] = host # Preserve Host header for virtual hosting
187195
return super().send(request, **kwargs)
188196

189197
def _validate_host_ip(self, host: str):

0 commit comments

Comments
 (0)