Een wachtwoord met @ of # kan een handmatig samengestelde proxy-URL beschadigen, zelfs wanneer de inloggegevens kloppen. Die tekens hebben al betekenis in een URL, waardoor de client een deel van het wachtwoord als hostnaam of fragment kan interpreteren.

Codeer de twee velden met inloggegevens apart

Dit voorbeeld houdt de structurele scheidingstekens van de URL intact en codeert alleen gebruikersnaam en wachtwoord:

from urllib.parse import quote

username = "user@team"
password = "p:a/ss#?"
proxy_url = (
    "http://"
    + quote(username, safe="")
    + ":"
    + quote(password, safe="")
    + "@203.0.113.10:8080"
)

Gebruik je echte endpoint en inloggegevens. Het getoonde adres is een documentatievoorbeeld. Het lege argument safe is belangrijk: quote laat een schuine streep normaal ongemoeid, maar binnen dit veld moet die worden gecodeerd.

Codeer niet de hele proxy-URL. Het coderen van de schemescheidingstekens en de @ tussen inloggegevens en host vernietigt de structuur die je wilde behouden. Codeer ook een al gecodeerd wachtwoord niet opnieuw.

Gebruik het resultaat met Requests

import requests

response = requests.get(
    "https://example.com/",
    proxies={"http": proxy_url, "https": proxy_url},
    timeout=(5, 15),
)
response.raise_for_status()

Als het request nog faalt, controleer dan of de proxy de aanmelding weigert of de client al eerder bij het parsen of verbinden faalde. Een 407-authenticatieverzoek en een ongeldige URL zijn verschillende fouten.

HTTPX kan authenticatie apart houden

Een HTTPX Proxy-object kan het endpoint en de inloggegevens als aparte argumenten aannemen:

import httpx

proxy = httpx.Proxy(
    "http://203.0.113.10:8080",
    auth=("user@team", "p:a/ss#?"),
)

with httpx.Client(proxy=proxy, trust_env=False, timeout=15) as client:
    response = client.get("https://example.com/")
    response.raise_for_status()

Daardoor hoef je het userinfo-deel niet zelf op te bouwen. Het versleutelt de gegevens niet onafhankelijk van de proxyverbinding en kiest geen authenticatiemethode die elke dienst ondersteunt.

Als een gratis lijst alleen IP en poort geeft, levert dit voorbeeld geen standaardinloggegevens. Gebruik authenticatie alleen wanneer de beheerder daadwerkelijk een account verstrekt. Zet URL's met inloggegevens niet in gedeelde logs of bronbestanden.

Gerelateerde artikelen