NovinkaZverejnili sme 50+ Laravel balíkov ako open source
Custom AI apps, agents and automation — Roundly ConsultingRoundly
Všetky balíky
Safe Fetch for Laravel

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 to

Pri 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 kryptomien

Odoslaní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.