Použitie vo vlastnom balíku
Balíky, ktoré posielajú požiadavky na URL adresy zadané ich vlastnými používateľmi — odosielanie webhookov, importy, náhľady odkazov — stavajú na Safe Fetch rovnakým spôsobom.
Vlastné pravidlá nad pravidlami aplikácie
Začnite od SafeFetch::policy(), aby bloky aplikácie — blokovaní hostitelia a rozsahy, jej vlastní hostitelia — platili ďalej, a zahoďte jej uvoľnenia: meno, ktorému dôveruje ako privátnemu (minio.internal), rozsah otvorený pre lokálny vývoj (127.0.0.1/32) a zoznam povolených hostiteľov pre celú aplikáciu vznikli pre jej vlastné požiadavky, nie pre URL adresy, ktoré zadávajú vaši používatelia:
$policy = SafeFetch::policy()
->withoutHostAllowlist()->withoutPrivateHosts()->withoutAllowedRanges()
->blockAppHosts()->appHosts($appHosts)
->blockHosts($blockedHosts)->blockRanges($blockedRanges)->allowRanges($allowedRanges)
->ports($ports)->maxResponseBytes(4096)
->redirects(RedirectPolicy::methodPreserving($max, forwardHeaders: ['webhook-id', 'webhook-timestamp', 'webhook-signature']));
$policy = $allowedHosts === [] ? $policy : $policy->allowHosts($allowedHosts);- blockAppHosts() zapne blokovanie hostiteľov aplikácie bez ohľadu na jej konfiguráciu (blockAppHosts(false) ho vypne).
- allowHosts() nahradí zoznam povolených a prázdny zoznam odmietne — rozvetvite kód podľa vlastného nastavenia ako vyššie, namiesto odovzdania zoznamu, ktorý môže byť prázdny.
- RedirectPolicy::methodPreserving($max, forwardHeaders: [...]) sleduje len 307/308 a pomenované hlavičky pošle aj na iný origin, kam presmerovanie vedie; každá iná hlavička a všetky prihlasovacie údaje zostanú pri prvom origine.
Odosielanie cez manažéra, obmedzovač najprv
Injektujte SafeFetchManager (alebo použite fasádu) a volajte guard() — nikdy makro Http::safe(), ktoré by iný balík mohol nahradiť. Obmedzovač pridajte pred ochranu, aby bežal raz na volanie, ešte pred prekladom DNS ($throttle je akýkoľvek middleware Guzzle):
$response = $safeFetch->guard(
Http::withMiddleware($throttle)->connectTimeout(5)->timeout(10)->withHeaders($headers),
$policy,
)->withBody($body, 'application/json')->post($url);Opakovanie končí pri odmietnutí
$response = $safeFetch->guard(Http::retry(3, 100, fn (Throwable $e) => ! $e instanceof SafeFetchException), $policy)
->post($url, $payload);Konečné alebo opakovateľné
try {
$response = $safeFetch->guard(Http::timeout(10), $policy)->post($url, $payload);
} catch (DestinationRejected $e) {
$outcome = ['retry' => false, 'reason' => $e->reason()->value, 'rule' => $e->blockedBy()]; // never retry
} catch (DestinationUnavailable $e) {
$outcome = ['retry' => true, 'reason' => $e->reason()->value]; // unresolved, out of time
}DestinationRejected je konečné — reason() a blockedBy() si uložte pre prevádzkovateľov, ale rozdiel nikdy neukazujte tomu, kto URL odoslal. Chyba prenosu chránenej požiadavky je vlastná ConnectionException Laravelu, ktorej správa obsahuje URL adresu — nezobrazujte ju.
Obmedzená odpoveď a odkiaľ prišla
$response = $safeFetch->guard(Http::timeout(10), $policy->maxResponseBytes(4096))->post($url, $payload);
$excerpt = $response->body(); // at most 4 096 bytes
$cut = $safeFetch->truncated($response); // true when the body was cut
$remoteAddress = $response->handlerStats()['primary_ip'] ?? null; // the vetted address it connected toPri ukladaní: všetky pravidlá okrem prekladu
Keď sa URL adresa ukladá, a nie volá (koncový bod, ktorý si používateľ zaregistruje), posúďte ju bez čakania na DNS:
$request->validate(['endpoint' => ['required', 'string', SafeUrl::withoutLookup($policy)]]);
$stored = $safeFetch->precheck($request->input('endpoint'), $policy)->toString();Ochrana posúdi URL adresu v plnom rozsahu pri každej požiadavke; recepty na testovanie balíka nájdete v časti Testovanie.
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.