Všetky balíky
Safe Fetch for Laravel
Model hrozieb
Útočník ovláda URL adresu, ktorú aplikácia načítava, DNS mena v tejto URL (TTL 0, striedajúce sa odpovede) a HTTP server na verejnej adrese (akýkoľvek stav, Location a telo). Chráneným aktívom je všetko, čo je dostupné z hostiteľa aplikácie a útočník sa k tomu nedostane: loopback služby, privátna sieť, cloudové metadáta, samotná aplikácia.
| Útok | Obrana |
|---|---|
| Privátna alebo metadátová adresa priamo v URL (http://169.254.169.254/, [fd00:ec2::254]) | Tabuľka blokovaných sietí. |
| Alternatívne zápisy IPv4 (2130706433, 0x7f.1, 0177.0.0.1, 127.1) | Kanonizácia ich odmietne, nikdy ich nenormalizuje. |
| IPv4 vnútri IPv6 ([::ffff:127.0.0.1], NAT64, 6to4, Teredo) | Pravidlá vnorenia; 2001::/23 (vrátane Teredo) blokované celé. |
| Meno so súkromnou odpoveďou, alebo jednou súkromnou z viacerých | Preloží sa raz, posúdi sa každá adresa; jedna súkromná odpoveď meno zablokuje. |
| DNS rebinding | Každá overená adresa pripnutá do curl (CURLOPT_RESOLVE); curl meno nikdy neprekladá sám. |
| Proxy z prostredia si meno preloží sama | proxy: '' pri každom kroku; proxy nastavenú volajúcim ochrana odmietne. |
| Zdieľané spojenie otvorené na inú adresu | Handler vlastnený ochranou, CURLOPT_FRESH_CONNECT, CURLOPT_FORBID_REUSE. |
| Handler bez curl ignoruje pripnutie | Ochrana vynúti vlastný curl handler a potom skontroluje primary_ip. |
| Kód za ochranou presmeruje požiadavku alebo zruší pripnutie | Handler pred spojením znovu skontroluje URL, hlavičku Host a voľby pripnutia; CURLOPT_PREREQFUNCTION preruší spojenie mimo overených adries pred odoslaním prvého bajtu. |
| Voľba curl od volajúceho, ktorá obíde pripnutie (CURLOPT_UNIX_SOCKET_PATH, CURLOPT_CONNECT_TO, CURLOPT_PRE_PROXY …) | Voľby curl od volajúceho prechádzajú zoznamom povolených. |
| Presmerovanie na privátnu adresu, na http alebo do slučky | Presmerovania sú predvolene vypnuté; po zapnutí sa každý krok overí a pripne, prechod na http a prekročenie limitu sa odmietnu. |
| Prihlasovacie údaje poslané pri presmerovaní na iný origin | auth, Authorization a curl HTTPAUTH / USERPWD sa na inom origine zahodia (CVE-2022-31090); hlavičky len na prvý origin, plus výslovný zoznam preposielaných. |
| Neobmedzená odpoveď | maxResponseBytes v pravidlách (oreže); maxBytes vo fetch() (too_large). |
| Rozdiely medzi parsermi (a.com\@127.0.0.1, #@, zone id, %) | Striktný parser; požiadavka ide na prestavanú URL. |
| Self-SSRF (vlastný hostiteľ aplikácie za verejným load balancerom) | Mená hostiteľov aplikácie sa odmietnu podľa mena. |
| Text chyby zmapuje internú sieť | Pevné správy podľa dôvodu, nikdy URL ani adresa; blocked a unresolved majú jednu spoločnú správu. |
| Dôveryhodné privátne meno odpovie metadátovou adresou | Privátny hostiteľ nikdy nevyníma cloudovú metadátovú adresu; to dokáže len povolený rozsah. |
| Balík zdedí uvoľnenia hostiteľa pre URL adresy svojich používateľov | withoutHostAllowlist(), withoutPrivateHosts(), withoutAllowedRanges() ich zahodia a bloky zostanú; allowHosts([]) vyhodí výnimku. |
| Obídenie „len týchto hostiteľov“ adresou priamo v URL | Striktný zoznam povolených hostiteľov odmietne každú adresu zapísanú priamo. |
Čo zaručené nie je
- Žiadna ochrana, keď ochrana nie je v ceste — obyčajné Http::get() chránené nie je.
- Ak aplikácia po makre presmeruje handler Http::safe() (->setHandler()), odstráni handler ochrany aj jeho opätovnú kontrolu; kontrola pred odoslaním stále ide s voľbami curl daného kroku (ak je tým handlerom curl) a kontrola primary_ip zachytí akýkoľvek iný handler až po odoslaní požiadavky. Nahradenie klienta cez setClient() po makre ochranu odstráni úplne (klient nastavený pred makrom sa odmietne).
- Iný balík, ktorý zaregistruje makro safe po tomto, ho potichu nahradí — bezpečnostne kritický kód volá SafeFetch::guard() alebo SafeFetch::http().
- Preklad DNS sa v PHP nedá časovo obmedziť; timeout požiadavky pokrýva len prenos.
- Záznamy AAAA prichádzajú z DNS, nie z /etc/hosts — PHP nemá API pre IPv6 záznam zo súboru hosts.
- Povolenému rozsahu alebo privátnemu hostiteľovi sa dôveruje úplne na základe vašej konfigurácie — okrem toho, že privátny hostiteľ sa nikdy nedostane k cloudovej metadátovej adrese.
- precheck() a SafeUrl::withoutLookup() meno neprekladajú: meno, ktoré prejde, sa môže preložiť na privátnu adresu. Ochrana ho posúdi v plnom rozsahu pri načítaní.
- reason(), retryable() a blockedBy() rozlišujú „privátne“ od „neexistuje“ — tento rozdiel držte mimo dosahu toho, kto URL odoslal.
- Aplikácia dostupná cez verejné meno, ktoré nie je medzi jej hostiteľmi (iné DNS meno pre tú istú IP), sa nerozpozná — ďalšie mená uveďte v app_hosts.extra.
- retry() Laravelu opakuje pri každej výnimke, ak callback when nepovie inak, preto filtrujte SafeFetchException, aby ste skončili pri prvom odmietnutí.
- Nové spojenie pri každej požiadavke: medzi chránenými požiadavkami nie je keep-alive — to je cena za žiadne zdieľanie spojení.
Prejavte lásku k open source
Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.
Ďalšie spôsoby podpory vrátane kryptomienOdoslaním daru súhlasíte s našimi podmienkami prijímania darov.
Chcete to zabudovať do svojho produktu?
Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.