Konfigurácia
config/safe-fetch.php sú predvolené pravidlá pre Http::safe(), SafeFetch::vet(), SafeFetch::fetch() a pravidlo safe_url. Tabuľka blokovaných sietí platí vždy; tieto nastavenia k nej len pridávajú alebo z nej vynímajú. Publikujete ju cez --tag=safe-fetch-config:
use RoundlyConsulting\SafeFetch\Support\SystemHostResolver;
return [
// http too (local development, internal tools). https only by default.
'allow_http' => env('SAFE_FETCH_ALLOW_HTTP', false),
// null => any port 1–65535; otherwise the only ports a URL may use, e.g. [443].
'ports' => null,
'hosts' => [
// Non-empty => ONLY these hosts (exact or *.example.com). Still resolved,
// judged and pinned: an allowed host never makes a private address OK.
'allowed' => [],
// Refused by name, before any lookup.
'blocked' => [],
// Names whose addresses may be private (e.g. minio.internal). Still
// resolved and pinned.
'private' => [],
],
'ranges' => [
// Addresses / CIDRs exempt from the blocked-network table, e.g.
// ['127.0.0.1/32', '10.20.0.0/16']. 0.0.0.0/0 and ::/0 are refused.
'allowed' => [],
// Extra addresses / CIDRs always refused; they beat every allow.
'blocked' => [],
],
// The app's own host names (app.url's host + extra) are refused by name, and
// app.url's address when it is written as one: a request to yourself through
// a public load balancer is SSRF too.
'app_hosts' => [
'block' => true,
'extra' => [],
],
'redirects' => [
// Off by default: a redirect is returned to the caller unfollowed.
'enabled' => env('SAFE_FETCH_REDIRECTS', false),
// Hops followed at most, 0–10.
'max' => env('SAFE_FETCH_MAX_REDIRECTS', 3),
// null => 307 and 308 (method and body kept); SafeFetch::fetch(), which
// only sends GETs, follows 301, 302, 303, 307 and 308 then. Otherwise a
// subset of those five.
'statuses' => null,
// https -> http.
'allow_downgrade' => false,
// Header names also sent to another origin a redirect leads to
// (Accept, Content-Type, User-Agent and the like always are).
'forward_headers' => [],
],
'fetch' => [
// SafeFetch::fetch() body cap in bytes, at least 1.
'max_bytes' => env('SAFE_FETCH_MAX_BYTES', 5_242_880),
// SafeFetch::fetch() time budget in seconds, 1–600, every hop included.
'timeout' => env('SAFE_FETCH_TIMEOUT', 30),
],
// The resolver behind every lookup: any class implementing
// RoundlyConsulting\SafeFetch\Contracts\HostResolver.
'resolver' => SystemHostResolver::class,
];Všetky kľúče
| Kľúč | Env | Predvolené | Účel |
|---|---|---|---|
allow_http | SAFE_FETCH_ALLOW_HTTP | false | Okrem https aj http. |
ports | — | null | null pre ľubovoľný port, alebo neprázdny zoznam 1–65535 — jediné porty, ktoré URL adresa smie použiť. |
hosts.allowed | — | [] | Vzory hostiteľov; neprázdny zoznam znamená len tieto hostiteľov. Aj tak sa preložia, posúdia a pripnú. |
hosts.blocked | — | [] | Vzory hostiteľov odmietnuté podľa mena, ešte pred prekladom. |
hosts.private | — | [] | Vzory hostiteľov, ktorých adresy smú byť privátne (minio.internal) — nikdy nie cloudová metadátová adresa. |
ranges.allowed | — | [] | Adresy alebo CIDR vyňaté z tabuľky blokovaných sietí; nikdy 0.0.0.0/0, ::/0 ani IPv6 prefix, ktorý nesie celé IPv4. |
ranges.blocked | — | [] | Adresy alebo CIDR vždy odmietnuté; majú prednosť pred každým povolením. |
app_hosts.block | — | true | Odmietne vlastné mená hostiteľov aplikácie a adresu z app.url, ak je zapísaná ako adresa. |
app_hosts.extra | — | [] | Vzory hostiteľov, ktoré tiež znamenajú aplikáciu — hostiteľ z app.url vždy. |
redirects.enabled | SAFE_FETCH_REDIRECTS | false | Sledovať presmerovania; vypnuté vráti presmerovanie volajúcemu bez sledovania. |
redirects.max | SAFE_FETCH_MAX_REDIRECTS | 3 | Najviac sledovaných krokov, 0–10. |
redirects.statuses | — | null | null: 307 a 308 (pre fetch() a download() všetkých päť); inak podmnožina 301, 302, 303, 307, 308. |
redirects.allow_downgrade | — | false | Povoliť https → http. |
redirects.forward_headers | — | [] | Názvy hlavičiek, ktoré sa pošlú aj na iný origin, kam vedie presmerovanie. |
fetch.max_bytes | SAFE_FETCH_MAX_BYTES | 5242880 | Aspoň 1 — limit tela pre fetch() a download(). |
fetch.timeout | SAFE_FETCH_TIMEOUT | 30 | 1–600 sekúnd — časový rozpočet fetch() a download(), vrátane všetkých krokov. |
resolver | — | SystemHostResolver::class | Ľubovoľná inštancovateľná trieda implementujúca Contracts\HostResolver; čokoľvek iné vyhodí výnimku pri vytvorení. |
Prísne čítanie
- Každý kľúč sa číta prísne: nesprávny typ alebo hodnota mimo rozsahu vyhodí InvalidConfigurationException s názvom kľúča, namiesto tichého návratu k voľnejšiemu nastaveniu.
- Prázdna hodnota (KEY= v prostredí) znamená nenastavené a použije sa predvolená hodnota.
- Logické hodnoty v env prijímajú true/false, 1/0, on/off a yes/no. Zoznamy prijímajú pole alebo zoznam oddelený čiarkami v env.
- Nastavenia, ktoré by ochranu úplne vypli, sa odmietnu — 0.0.0.0/0 a ::/0 v ranges.allowed alebo IPv6 prefix, ktorý nesie celé IPv4 (::ffff:0:0/96, 2002::/16).
- Globálny vypínač neexistuje. Kód, ktorý ho potrebuje, si ponechá vlastné nastavenie a ochranu jednoducho nezavolá.
Premenné prostredia
SAFE_FETCH_ALLOW_HTTP=false
SAFE_FETCH_REDIRECTS=false
SAFE_FETCH_MAX_REDIRECTS=3
SAFE_FETCH_MAX_BYTES=5242880
SAFE_FETCH_TIMEOUT=30Vlastní hostitelia aplikácie
Hostiteľ z app.url sa vždy počíta ako aplikácia — bez schémy sa číta ako https (myapp.example, myapp.example:8080). Ak je app.url zapísaná ako adresa (https://52.10.20.30), odmietne sa ako app_host tiež, v akomkoľvek zápise. Iné verejné meno pre tú istú IP adresu sa nerozpozná: uveďte ho v app_hosts.extra.
Preklady
resources/lang/{en,sk}/messages.php obsahuje jeden riadok pre každý dôvod (status preberá :status) a validation.php správu pre safe_url (s :attribute). Ak ich chcete preformulovať, publikujte ich cez --tag=safe-fetch-translations.
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.