Events\DestinationRefused sa vyvolá pri každom odmietnutí — pri overení (každý krok, allows(), precheck() aj pravidlo) a keď sa požiadavka pripojila mimo overenej množiny (cannot_pin):
final readonly class DestinationRefused
{
public Reason $reason;
public string $host; // canonical; '' when the URL had none the guard could read
public ?string $blockedBy; // for blocked: hostname, blocked_host, app_host, blocked_range, private_address
public string $via; // vet, allows, precheck, request, fetch, download
}Nikdy neobsahuje URL adresu (môže to byť URL s oprávnením) ani preloženú adresu. via hovorí, kde sa URL posudzovala:
| via | Význam |
|---|---|
vet | SafeFetch::vet(). |
allows | SafeFetch::allows(), pravidlo SafeUrl a safe_url. |
precheck | SafeFetch::precheck() a SafeUrl::withoutLookup(). |
request | Krok chránenej požiadavky (Http::safe(), guard(), http()). |
fetch · download | Krok SafeFetch::fetch() alebo SafeFetch::download(). |
Odmietnutia sú presne to, ako vyzerá pokus o SSRF — oplatí sa listener, ktorý upozorní, a ktorý zároveň vie preskočiť, čo odmietol formulár:
use Illuminate\Support\Facades\Event;
use Illuminate\Support\Facades\Log;
use RoundlyConsulting\SafeFetch\Events\DestinationRefused;
Event::listen(function (DestinationRefused $event): void {
if (! in_array($event->via, ['allows', 'precheck'], true)) {
Log::warning('Outbound request refused', ['reason' => $event->reason->value, 'host' => $event->host, 'rule' => $event->blockedBy, 'via' => $event->via]);
}
});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.