Všetky balíky
Webhooks for Laravel
Model hrozieb
| Hrozba | Obrana |
|---|---|
| Podvrhnuté prichádzajúce požiadavky | HMAC-SHA256 (alebo RFC 9421) nad id, časovou pečiatkou a surovým telom, overené cez Sentinel v konštantnom čase voči každému platnému kľúču; najviac 8 položiek a 4 KB na hlavičku. |
| Prehraté zachytené požiadavky | Tolerancia 5 minút, podpísané id doručenia deduplikované 7 dní (+ unikátny index), strážca odtlačku tela pre nepodpísané id, nonce RFC 9421 zaznamenané atomicky s uloženým doručením. |
| Rozdelenie jednej správy na viac | Podpísané id má prednosť pred akýmkoľvek Idempotency-Key; rovnaké id s iným telom sa odmietne. |
| Zisťovanie existujúcich endpointov | Neznáme, zmazané a vypnuté kľúče odpovedajú rovnakou 404; kľúče nesú približne 190 bitov; neznáme kľúče nevyvolajú udalosť. |
| Vyčerpanie zdrojov na prichádzajúcej trase | 413 a 415 pred akýmkoľvek MAC, strážca odmietnutí na endpoint a IP, limit doručení na endpoint, spracovanie len vo fronte — a limit tela na webovom serveri pre prvé čítanie. |
| Príjemca odpovedá nekonečným telom | Číta sa len do outbound.max_response_bytes so zapnutou aj vypnutou ochranou, v rámci 10 s; zaznamená sa response_truncated. |
| Nedôveryhodný obsah | JSON len do polí, hĺbka ≤ 64; žiadne unserialize, eval ani extract; sanitizér pred uložením. |
| Únik tajných kľúčov | Šifrované v pokoji, skryté, zobrazené raz, skryté v DTO, #[SensitiveParameter], nikdy v udalostiach, logoch, resources, about ani webhooks:endpoints; vymazané pri zmazaní. |
| SSRF a DNS rebinding | Ochrana Safe Fetch pri uložení aj pri každom kroku: len https, každá preložená adresa verejná, hostitelia aplikácie blokovaní, spojenie pripnuté na overené adresy, bez proxy, presmerovania vypnuté alebo znova overené. |
| Podvrhnutie a injekcia hlavičiek | Názvy a hodnoty vlastných hlavičiek sa overujú; rámcové, podpisové a proxy hlavičky sa nikdy nedajú nastaviť. |
| Búrky opakovaní | Exponenciálny odstup s rozptylom, rešpektovaný Retry-After, obmedzenie na endpoint, automatické vypnutie. |
Čo balík nerieši
- Výmena riadkov niekým s prístupom na zápis do databázy — encrypted cast nie je viazaný na riadok, takže kto môže zapisovať do databázy, môže skopírovať šifrovaný kľúč jedného endpointu k inému.
- Kompromitovaný odosielateľ alebo príjemca — kto má tajný kľúč, vie podpisovať.
- Rozdiel hodín — odosielatelia aj príjemcovia potrebujú NTP; toleranciu môžete nastaviť pre každý endpoint.
- Výstupná proxy pre celú aplikáciu — ochrana obchádza proxy z prostredia; s WEBHOOKS_SSRF_GUARD=off neexistuje žiadna ochrana cieľov (limit odpovede stále platí).
- Zdieľané IP klientov — za load balancerom alebo CDN bez dôveryhodných proxy môžu chybné požiadavky cudzieho na minútu obmedziť skutočného odosielateľa.
- Listenery WebhookReceived vo fronte — ukladajú sanitizovaný obsah do frontu nešifrovaný.
- Poradie — medzi doručeniami na jeden endpoint nie je zaručené; príjemcovia radia podľa časovej pečiatky v obálke.
- Obmedzenie odosielania na endpoint s úložiskom v pamäti platí len v rámci procesu.
Výnimky
V RoundlyConsulting\Webhooks\Exceptions, rozširujú WebhooksException (RuntimeException) a majú preložené správy. Konfiguračné hodnoty, ktoré sa nedajú načítať, vyhodia InvalidConfigurationException z package-toolkit:
| Výnimka | Vyhodí sa, keď |
|---|---|
EndpointNotFoundException | find() nenájde; prístup obmedzený na vlastníka dostane cudzí endpoint alebo doručenie. |
EndpointNotAcceptingException | send(), ping(), redeliver() alebo redeliverFailed() na vypnutý endpoint, send() na endpoint bez odberu — reason(): disabled alebo not_subscribed. |
InvalidEndpointException | Chybná URL, vlastná hlavička, zoznam odberov, importovaný tajný kľúč alebo voľba. |
InvalidEventTypeException | Chybný typ udalosti alebo typ mimo outbound.event_types. |
PayloadTooLargeException | Zakódované odchádzajúce telo nad outbound.max_payload_bytes. |
PayloadPrunedException | Replay alebo opätovné doručenie doručenia, ktorého telo odstránila retencia. |
DeliveryInProgressException | Replay doručenia, ktoré sa práve spracúva; opätovné doručenie takého, ktoré je ešte pending, sending alebo retrying. |
DestinationBlockedException | Ochrana pred SSRF odmietne odchádzajúcu URL pri uložení — reason(), blockedBy(), unresolved(). |
WebhookSignatureException | Schéma odmietne požiadavku — reason(): RejectionReason; because() pre vlastné schémy. |
UnknownSchemeException · UnknownHandlerException | Neregistrovaný názov alebo alias, prípadne trieda, ktorá nie je schémou ani handlerom. |
SecretRotationException | Prechodné obdobie v minulosti alebo dlhšie ako secrets.max_grace_seconds. |
SigningUnavailableException | Počas pokusu pre endpoint, ktorého schéma nevie podpisovať — zachytí sa: doručenie zlyhá so signing. |
PayloadSanitizerException | Sanitizér vyhodil výnimku (odpoveď 500 sanitizer_failed). |
InvalidWebhooksConfigurationException | Konfiguračný kľúč s triedou neukazuje na implementáciu; vlastník, ktorého kľúč nezodpovedá webhooks.key_type. |
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.