File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff 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 ):
You can’t perform that action at this time.
0 commit comments