Välityspalvelimen IP-osoitteiden ja heksaporttien poiminta upotetusta JSONista
Pura tunnettuja JSON-hyötykuormia välityspalvelinluetteloiden skriptikutsuista ja tulkitse heksaportti vain, kun lähdemuoto ilmoittaa sen.
Tyhjä HTML-taulu ei aina tarkoita, ettei vastaus sisällä välityspalvelintietueita. Jotkin luettelot sijoittavat JSON-objekteja JavaScript-kutsujen sisään ja täyttävät rivit myöhemmin.
Jos jo hankittu lähde käyttää tiettyä käärettä gp.insertPrx ja sen jälkeen JSON-objektia:
import ipaddress
import json
import re
decoder = json.JSONDecoder()
endpoints = set()
for marker in re.finditer(r"gp[.]insertPrx\(\s*", html):
try:
row, end = decoder.raw_decode(html, marker.end())
if not isinstance(row, dict):
continue
address = ipaddress.ip_address(row["PROXY_IP"])
port = int(row["PROXY_PORT"], 16)
except (ValueError, KeyError, TypeError):
continue
if 1 <= port <= 65535 and html[end:].lstrip().startswith(");"):
endpoints.add((str(address), port))
html on lähdeteksti, ei selainobjekti. Säännöllinen lauseke löytää tunnetun kääreen; JSONDecoder määrittää, mihin JSON-arvo päättyy. Näin vältetään yritys jäsentää sisäkkäinen JSON pelkällä säännöllisellä lausekkeella.
Esimerkin porttikenttä on nimenomaisesti heksadesimaalinen: C38 tarkoittaa desimaalia 3128. Älä käytä kantaa 16 toisen palveluntarjoajan desimaalikenttään vain siksi, että molempia kutsutaan portiksi.
Tämä on jäsennin ilmoitetulle muodolle, ei JavaScript-tulkki. Yksinkertaisin lainausmerkein kirjoitetut objektilitteraalit, lasketut arvot ja muut JavaScript-lausekkeet tarvitsevat toisen dokumentoidun datarajapinnan. Älä suorita mielivaltaista sivukoodia päätepisteluettelon saamiseksi.
Vahvista lähdesopimus ja pidä protokollakentät erillään. Jos lähteessä on sen sijaan täytetyt HTML-rivit, käytä rivikohtaista päätepisteiden poimintaa tämän JavaScript-käärejäsentimen sijaan. Osoitteen ja portin poimiminen ei todista, että päätepiste tarjoaa tällä hetkellä käyttökelpoista välityspalvelua.