Potřeboval jsem ujasnit některé hlavičky a jak funguje komunikace mezi serverem který chci navštívit a serverem ze kterého stahuji externí soubor s javaskriptem. Druhý server spravuje dokumenty v rámci politiky GDPR aj. Klíčové slovo je zde referer, které se jeví jako důležité pro to, aby server neodmítnul komunikaci (respektive, aby neodmítnul vydat ten soubor). Nicméně je ještě třeba zmínit, že když ten soubor s JS už je stažený, není třeba ho znovu stahovat, takže tam má potom být hlavička 303...
Takže navštívil jsem stránku a zkopíroval jednotlivé hlavičky. Při potvrzení Souhlasím nebo Odmítám jsem neviděl žádnou další hlavičku. Ale to je zvláštní, protože na Windows XP když jsem to zkoušel, tak se tam jedna hlavička se objevila.
Dotaz na ChatGPT 4o
Vysvětlete některé hlavičky při prohlížení stránky:
Zajímají mě tyto:
"Referer: https://zpo....cz/
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Sec-GPC: 1
Upgrade-Insecure-Requests: 1
"
a tyto "Referer: https://zpo....cz/
Sec-Fetch-Dest: script
Sec-Fetch-Mode: no-cors
Sec-Fetch-Site: cross-site
Sec-GPC: 1
"
což jsou dvě části z hlaviček požadavku. Co proběhlo celá ta komunikace hlaviček a stažení je tady:
1. STAŽEN Dokument HTML, stav 200, metoda GET, soubor /, html,
Hlavičky:
{
"GET": {
"scheme": "https",
"host": "zpo....cz",
"filename": "/",
"remote": {
"Adresa": "81.95.107.207:443"
}
}
}
Stav: 200 OK
Verze: HTTP/1.1
Přeneseno: 55,21 kB (velikost 54,84 kB)
Priorita požadavku: Highest
Překlad DNS: Systémové
HLAVIČKY ODPOVĚDI:
Cache-Control: no-cache
Content-Length: 54844
Content-Type: text/html
Date: Thu, 12 Sep 2024 10:51:14 GMT
Expires: Thu, 12 Sep 2024 10:51:14 GMT
Pragma: No-cache
Server: Microsoft-IIS/8.5
Set-Cookie: PHPSESSID=nokab95nldik6n67k2i9rmq9p3; path=/
Set-Cookie: kdojeto=731244171; expires=Wed, 25-Dec-2024 14:51:14 GMT
X-Powered-By: PHP/5.2.6
X-Powered-By: ASP.NET
+HLAVIČKY POŽADAVKU:
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/png,image/svg+xml,*/*;q=0.8
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: cs,sk;q=0.8,en-US;q=0.5,en;q=0.3
Connection: keep-alive
DNT: 1
Host: zpo....cz
Priority: u=0, i
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Sec-GPC: 1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:130.0) Gecko/20100101 Firefox/130.0
*********************************************
2. STAŽEN SOUBOR JS ZE SERVERU www.freeprivavypolicy.com:
cookie-consent.js
(GET
https://www.freeprivacypolicy.com/public/cookie-consent/4.0.0/cookie-consent.js)
Stav: 200
Verze: HTTP/2
Přeneseno 58,05 kB (velikost 208,40 kB)
Referrer Policy: strict-origin-when-cross-origin
Překlad DNS: Systémové
HLAVIČKY ODPOVĚDI:
Bez mezipaměti
2 požadavky
Přeneseno: 113,26 kB / 263,25 kB
Hotovo za 5,14 s
DOMContentLoaded: 1,72 s
load: 6,13 s
GET https://www.freeprivacypolicy.com/public/cookie-consent/4.0.0/cookie-consent.js
Stav
200
Verze: HTTP/2
Přeneseno 58,05 kB (velikost 208,40 kB)
Referrer Policy:strict-origin-when-cross-origin
Překlad DNS: Systémové
HLAVIČKY ODPOVĚDI:
age: 36188
alt-svc: h3=":443"; ma=86400
cache-control: public, immutable, max-age=3600
cf-bgj: minify
cf-cache-status: HIT
cf-polished: origSize=208402
cf-ray: 8c1f575feb67901e-FRA
content-encoding: br
content-type: application/javascript
date: Thu, 12 Sep 2024 10:51:15 GMT
etag: W/"0c766f68f2fedb231ad3b2c8fdde350b"
expires: Thu, 12 Sep 2024 01:14:35 GMT
last-modified: Wed, 11 Sep 2024 23:14:35 GMT
nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
referrer-policy: strict-origin-when-cross-origin
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v4?s=8qrMazROYhJV%2FQtrNeG%2BwZ1rLIOcqNLftPDz9D7M0okZcsjNwJK4lOJV9rE5sInPB4yg73vGSgppL932uLhxwUiVDYKU5KsHGcQMfGm73DJb07%2BhnI5KjarBMDwrJKJFGrL1MXGfPxsOfzM%3D"}],"group":"cf-nel","max_age":604800}
server: cloudflare
vary: Accept-Encoding
x-content-type-options: nosniff
X-Firefox-Spdy: h2
x-frame-options: SAMEORIGIN
x-priority: 5/n
x-xss-protection: 1; mode=block
x-z: 5179
+HLAVIČKY POŽADAVKU:
Accept: */*
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: cs,sk;q=0.8,en-US;q=0.5,en;q=0.3
Connection: keep-alive
DNT: 1
Host: www.freeprivacypolicy.com
Priority: u=2
Referer: https://zpo....cz/
Sec-Fetch-Dest: script
Sec-Fetch-Mode: no-cors
Sec-Fetch-Site: cross-site
Sec-GPC: 1
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:130.0) Gecko/20100101 Firefox/130.0
3. NÁSLEDUJE POTVRZENÍ TLAČÍTKA "SOUHLASÍM":
Nepřišla a nebyla odeslána další hlavička (linux).
Ale na Windows XP jo.
Odpověď: Vysvětlení dotazovaných parametrů hlavičky
V této komunikaci vidíte, jak probíhá výměna hlaviček mezi klientem (váš prohlížeč) a serverem během načítání různých zdrojů. Pojďme se podívat na jednotlivé hlavičky:
1. Referer: https://zpo...cz
- Referer specifikuje, odkud byl požadavek odeslán. Například při načítání
cookie-consent.js
souboru se uvádí, že referenční stránka je z zpo....cz
. Server freeprivacypolicy.com
tak ví, že požadavek pochází z jiné domény.
2. Sec-Fetch-Dest
- Tato hlavička určuje, jaký typ zdroje se načítá. Zde jsou příklady:
- document: Hlavní dokument (HTML stránky).
- script: Skript, například JavaScriptový soubor.
3. Sec-Fetch-Mode
- navigate: Označuje, že se jedná o klasickou navigaci na novou stránku, například při načítání HTML dokumentu.
- no-cors: Umožňuje načítání zdrojů bez podpory
CORS
(Cross-Origin Resource Sharing), například skriptů z jiných domén, aniž by bylo nutné, aby server povolil zdroje přes Access-Control-Allow-Origin
.
4. Sec-Fetch-Site
- Určuje, zda požadavek pochází z té samé stránky nebo z jiné domény:
- none: Požadavek přišel z té samé domény (první případ).
- cross-site: Požadavek přišel z jiné domény (příklad načítání JavaScriptu z
freeprivacypolicy.com
).
5. Sec-Fetch-User
- ?1: Tato hodnota značí, že požadavek byl vyvolán uživatelem (např. kliknutí na odkaz).
6. Sec-GPC: 1
- Tato hlavička značí nastavení tzv. Global Privacy Control. Hodnota
1
znamená, že uživatel preferuje soukromí, tedy například omezení sledování.
7. Upgrade-Insecure-Requests: 1
- Značí, že prohlížeč preferuje bezpečnou verzi požadavku (HTTPS) oproti nešifrované (HTTP).
8. Accept
- Specifikuje, jaké typy obsahu prohlížeč očekává. Například:
- text/html: HTML dokument.
- application/javascript: JavaScriptový soubor.
- image/avif, image/webp: Typy obrázků.
- image/svg+xml: SVG obrázek.
9. Accept-Encoding
- Určuje, jaké formy komprese prohlížeč podporuje. V tomto případě:
- gzip, deflate, br, zstd jsou metody komprese, které prohlížeč podporuje pro zrychlení načítání.
10. DNT: 1
- Značí, že uživatel nechce být sledován (
DNT = Do Not Track
).
Shrnutí komunikace:
Nejprve byl stažen hlavní HTML dokument z zpo
....cz
. Požadavek byl GET
, prohlížeč požadoval HTML dokument a odpověď serveru byla 200 OK
s odpovídajícími hlavičkami (např. Cache-Control: no-cache
, což znamená, že stránka by neměla být uložena do mezipaměti).
Následně prohlížeč stáhl JavaScriptový soubor cookie-consent.js
z www.freeprivacypolicy.com
. Tento požadavek byl vyvolán jako cross-site (z jiné domény) s hlavičkou no-cors
, což znamená, že pro tento skript nebyla nutná podpora CORS
.
Dále nastal problém při potvrzení tlačítka "Souhlasím", kdy na Linuxu nebyla odeslána nová hlavička, zatímco na Windows XP ano. To by mohlo být způsobeno rozdílným chováním prohlížeče nebo zabezpečením mezi těmito systémy.
Druhý dotaz na ChatGPT
"Referer: Referer specifikuje, odkud byl požadavek odeslán. Například při načítání cookie-consent.js souboru se uvádí, že referenční stránka je z zpo....cz. Server freeprivacypolicy.com tak ví, že požadavek pochází z jiné domény."
Nicméně já to chci podstrčit do curl ty hlavičky, abych až budu stahovat ten soubor s javascriptem freeprivacypolicy.com bral v potaz, že si prohlížím stránku zpo....cz - takže fakticky to neposílá server zpo....cz ale klient. Správně? slovo fetch v 2. Sec-Fetch-Dest a 3. Sec-Fetch-Mode spíš napovídá něco o způsobu zpracování (fetch) stránky. Upřesněte to. "cross-site: Požadavek přišel z jiné domény (příklad načítání JavaScriptu z freeprivacypolicy.com)."
Jak ale freeprivacypolicy.com může ověřit, že požadavek přišel z jiné domény, když si to v tom curl mohu přepsat tu hlavičku? Mohu ji zaměnit a změnit třeba server. Rozveďte smysl a účel cross-size a jak se používá. "Sec-Fetch-User
?1: Tato hodnota značí, že požadavek byl vyvolán uživatelem (např. kliknutí na odkaz)."
Jasně, to znamená, že i když v hlavičce je refererer, on si to stejně může modifikovat, takže server nemůže s jistotou určit zda to skutečně ten server zpo....cz žádá nebo ne.
"Accept-Encoding
Určuje, jaké formy komprese prohlížeč podporuje. V tomto případě: gzip, deflate, br, zstd jsou metody komprese, které prohlížeč podporuje pro zrychlení načítání."
Když odešlu tuto hlavičku přes curl, nebude to pak problém? Nebo pokud by to curl nepodporoval tuto compresi, mám použít httpie jako náhradu?Upřesňující odpověď
Ano, máte pravdu, že při použití nástroje jako je curl
posílá hlavičky klient (váš počítač, skript, prohlížeč) a ne server, což vám dává možnost tyto hlavičky libovolně upravit.
Vysvětlení hlaviček:
Sec-Fetch-Dest
:
Tato hlavička označuje typ cíle, který je požadován (např. dokument, script, image). U Sec-Fetch-Dest: document
jde o stahování HTML dokumentu, zatímco Sec-Fetch-Dest: script
znamená, že se požaduje JavaScript soubor. Toto pomáhá serveru identifikovat typ požadovaného zdroje.
Sec-Fetch-Mode
:
Tato hlavička říká, jaký typ požadavku byl proveden. V případě navigate
se jedná o požadavek na navigaci (např. kliknutí na odkaz nebo načtení stránky). no-cors
znamená, že se jedná o požadavek, který nevyžaduje kontrolu CORS (Cross-Origin Resource Sharing), což se běžně používá pro externí zdroje jako JS soubory nebo obrázky.
cross-site
(v rámci Sec-Fetch-Site
):
Tato hodnota hlavičky označuje, že požadavek pochází z jiné domény (například zpo....cz načítá soubor z freeprivacypolicy.com). Jak jste správně zmínil, server může jen těžko ověřit, zda skutečně požadavek pochází z jiné domény, protože Referer
a další hlavičky může klient (vy) upravit. Servery mohou ověřit původ pomocí CORS politiky a kontrolovat, zda jsou oprávněné domény povoleny pro přístup ke zdrojům.
Sec-Fetch-User
:
Tato hlavička (?1
) označuje, že požadavek byl vyvolán uživatelem, například kliknutím na odkaz. Server tak může reagovat jinak na požadavky uživatele než na automatizované požadavky.
Cross-site a jeho význam:
Cross-site požadavky jsou důležité z hlediska bezpečnosti a ochrany proti útokům, jako jsou CSRF (Cross-Site Request Forgery). Při cross-site požadavcích se server může rozhodnout, zda požadavek akceptuje na základě CORS pravidel. Když si hlavičky přepíšete v curlu, server to nepozná, ale pokud má striktní CORS politiku, může požadavek zamítnout.
Komprese a curl
:
Co se týče komprese (gzip
, deflate
, br
, zstd
), curl
podporuje většinu z těchto metod nativně. Pokud si nejste jistý, zda curl
podporuje určitou metodu, můžete použít přepínač --compressed
, který povolí curl
přijmout komprimovaný obsah. Pokud by curl
některou metodu nepodporoval, můžete zkusit jiný nástroj, například httpie, který má uživatelsky přívětivější rozhraní a nativní podporu více formátů komprese.
Např.:
curl --compressed https://www.example.com
Je možná svévolná záměna referer v hlavičce?
"Servery mohou ověřit původ pomocí CORS politiky a kontrolovat, zda jsou oprávněné domény povoleny pro přístup ke zdrojům."
Jasně, ale teoreticky mohu stahovat soubory html ze serveru zpo....cz, zatímco refererer pro javascript změním na jinou stránku, která je také na freeprivacypolicy.com registrována, takže si tento server bude myslet, že je to pro jiný server. Napříkad. Samozřejmě by takové jednání bylo zbytečné, stačí tam nechat refererer zpo....cz
Ano, ale nemá smysl
V rámci CORS server skutečně kontroluje, odkud požadavek přichází, ale pokud přepíšete hlavičku Referer
a změníte ji na jinou doménu, server (pokud má slabší nebo žádnou kontrolu) nebude schopen ověřit, zda požadavek skutečně pochází z dané domény. To znamená, že pokud změníte referer na doménu, kterou server považuje za legitimní (např. jinou stránku na freeprivacypolicy.com), server to nemusí odhalit.
Takové přepisování hlaviček by však obvykle nemělo praktický význam, jak jste zmínil. V případě, že byste chtěl přistupovat ke zdrojům z jiné domény, bude efektivnější použít skutečnou Referer
hodnotu (například z zpo....cz), protože to lépe odpovídá skutečnému scénáři, kdy si prohlížíte danou stránku a ona načítá externí zdroje.
Pokud by server freeprivacypolicy.com používal CORS politiku, která povoluje pouze konkrétní domény (například pouze example.com
), váš požadavek by byl odmítnut, pokud byste uvedli jiný referer než ten, který je povolený. Ale jak jste řekl, změna Referer
na správnou hodnotu (v tomto případě zpo....cz) by byla jednodušší a přirozenější.
Referer Strict Origin Policy when Cross Origin
1. GET https://www.freeprivacypolicy.com/public/cookie-consent/4.0.0/cookie-consent.js
"Referrer Policy:strict-origin-when-cross-origin"
Co znamená tato hodnota? A podle čeho prohlížeč věděl, že zpo....cz má nastaveno tento "strict" mode: Referrer Policy: strict-origin-when-cross-origin ?
2.
Ještě tam je několik nejasných parametrů a hodnot, zejména nosniff a h2.
x-content-type-options: nosniff
X-Firefox-Spdy: h2
x-frame-options: SAMEORIGIN
x-priority: 5/n
x-xss-protection: 1; mode=block
x-z: 5179
Odpověď
. Referrer Policy: strict-origin-when-cross-origin
Tato hodnota říká prohlížeči, jak nakládat s hlavičkou Referer
, když uživatel přechází mezi různými stránkami nebo když se načítají zdroje z různých domén:
strict-origin-when-cross-origin
znamená, že pokud je požadavek na stejnou doménu (například na zpo....cz), hlavička Referer
bude obsahovat plnou URL adresu.- Pokud je ale požadavek na jinou doménu (cross-origin), pak
Referer
obsahuje pouze původ domény, tedy schéma a doménu (např. jen https://zpo....cz
bez konkrétní cesty).
Jak to prohlížeč věděl?
Prohlížeč si nezávisle nevybírá Referrer-Policy
. Webová stránka nebo server může tuto politiku nastavit, a to buď přímo v HTML, nebo prostřednictvím HTTP hlaviček. Prohlížeč pak tuto politiku dodržuje při odesílání požadavků, například když načítá zdroje z jiných serverů. Pokud stránka zpo....cz má tuto politiku nastavenou, prohlížeč podle toho upraví hlavičku Referer
pro všechny cross-origin požadavky.
2. Další nejasné parametry
x-content-type-options: nosniff
Tato hlavička brání prohlížeči v „hádání“ typu obsahu souborů (content sniffing). Když je nastavena na nosniff
, prohlížeč bude vždy respektovat typ obsahu uvedený v hlavičce Content-Type
, a nebude se pokoušet odhadnout obsah na základě dat v souboru. To pomáhá předcházet určitým bezpečnostním rizikům, například spouštění škodlivých skriptů.
X-Firefox-Spdy: h2
Tato hlavička ukazuje, že prohlížeč (v tomto případě Firefox) použil protokol HTTP/2 (h2) pro tento požadavek. HTTP/2 je novější verze HTTP protokolu, která umožňuje efektivnější komunikaci mezi klientem a serverem (např. multiplexing, rychlejší načítání).
x-frame-options: SAMEORIGIN
Tato hlavička říká, že obsah stránky nesmí být vnořen do <iframe>
nebo jiných rámců na stránkách jiných domén. SAMEORIGIN
znamená, že pouze stránky ze stejné domény mohou vložit obsah do rámce. To pomáhá chránit před útoky, jako je „clickjacking“.
x-priority: 5/n
Tato hlavička obvykle udává, jakou prioritu má tento požadavek. V tomto případě je priorita nastavena na hodnotu 5/n
, což může znamenat relativní důležitost požadavku při vyřizování ze strany serveru, ale její konkrétní význam závisí na implementaci serveru.
x-xss-protection: 1; mode=block
Tato hlavička zapíná vestavěnou ochranu proti XSS (Cross-Site Scripting) v prohlížeči. Když je nastavena na 1
, prohlížeč bude chránit proti XSS útokům. Parametr mode=block
říká prohlížeči, aby v případě detekce XSS místo vykreslení stránky zablokoval celý obsah.
x-z: 5179
Tato hlavička může být vlastní implementací serveru a nemusí mít standardní význam. Hodnota 5179
může být ID pro interní sledování nebo zpracování požadavků, které server používá.
Celkově tyto hlavičky poskytují zabezpečení a správu toho, jakým způsobem prohlížeč nakládá s daty a jak server zachází s požadavky.
Network Error Logging (nel)
Co znamená toto:
nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v4?s=8qrMazROYhJV%2FQtrNeG%2BwZ1rLIOcqNLftPDz9D7M0okZcsjNwJK4lOJV9rE5sInPB4yg73vGSgppL932uLhxwUiVDYKU5KsHGcQMfGm73DJb07%2BhnI5KjarBMDwrJKJFGrL1MXGfPxsOfzM%3D"}],"group":"cf-nel","max_age":604800}
Co je nel?
Tyto dvě hlavičky, nel
a report-to
, souvisejí s mechanismem pro detekci a hlášení chyb v síťových přenosech pomocí Network Error Logging (NEL). Jsou využívány převážně na straně klienta (prohlížeče) pro monitorování a odesílání zpráv o problémech v síťových připojeních.
1. nel
hlavička (Network Error Logging)
Hlavička nel
konfiguruje pravidla pro zaznamenávání síťových chyb.
Význam jednotlivých parametrů pro tento typ hlavičky:
success_fraction: 0
: Určuje procento úspěšných síťových přenosů, které se mají logovat (0 znamená, že úspěšné přenosy se nebudou hlásit). Tedy se budou hlásit pouze chyby.report_to: "cf-nel"
: Tímto se specifikuje, kam se mají zasílat reporty o síťových chybách. V tomto případě se mají odesílat na skupinu s názvem "cf-nel"
, což odkazuje na službu Cloudflare.max_age: 604800
: Toto je doba platnosti politiky (v sekundách), po kterou budou tyto záznamy aktivní. 604800 sekund odpovídá jednomu týdnu.
2. report-to
hlavička
Hlavička report-to
definuje endpointy, kam mají být odeslány záznamy chyb.
Význam jednotlivých částí pro hlavčkureport-to:
endpoints
: Obsahuje seznam endpointů, na které se mají odesílat chybové reporty. Zde je pouze jeden endpoint na adrese "https://a.nel.cloudflare.com/report/v4?s=..."
, který je součástí služby Cloudflare.group: "cf-nel"
: Určuje název skupiny, do které tento endpoint patří. Tato skupina se shoduje s hodnotou v nel
hlavičce, což znamená, že všechny chyby definované v nel
budou zasílány na tuto adresu.max_age: 604800
: Udává dobu (v sekundách), po kterou tato pravidla zůstávají v platnosti (týden).
Účel a fungování:
Tyto hlavičky umožňují poskytovatelům (např. Cloudflare) monitorovat problémy s připojením jejich uživatelů. Pokud dojde k chybě v síťovém přenosu (např. nedostupnost serveru, selhání DNS, timeouty), prohlížeč (nebo jiný klient) zaznamená tuto chybu a odešle zprávu na předem definovaný server (endpoint), který je specifikován v report-to
hlavičce.
Tento mechanismus pomáhá poskytovatelům získat informace o problémech v síti a případně je řešit, aniž by uživatelé museli manuálně hlásit chyby.
Shrnutí:
nel
hlavička určuje, jaké typy síťových událostí mají být zaznamenávány a kam budou odesílány (v tomto případě pouze chyby).report-to
hlavička definuje endpoint (v tomto případě Cloudflare), kam se chybové hlášky budou zasílat.
Obě hlavičky spolupracují, aby umožnily automatizované sledování síťových problémů na straně klienta a jejich hlášení na server.
Je Cloudflare placená služba?
Ano, Cloudflare je placená služba, ale nabízí také bezplatnou variantu s omezenými funkcemi. Poskytuje služby pro zlepšení výkonu, bezpečnosti a spolehlivosti webových stránek, včetně Content Delivery Network (CDN), ochrany proti DDoS útokům, DNS managementu, SSL certifikátů a dalších.
Plány Cloudflare:
Bezplatný plán:
- CDN a caching.
- Ochrana proti DDoS útokům na základní úrovni.
- SSL certifikáty.
- Omezený přístup k analytickým nástrojům.
- Podpora HTTP/2 a další základní služby.
Placené plány:
- Pro plán (od cca 20 USD měsíčně): Nabízí pokročilé bezpečnostní funkce, lepší výkon a podrobnější analýzy.
- Business plán (od cca 200 USD měsíčně): Poskytuje vyšší úroveň zabezpečení a výkonu, včetně WAF (Web Application Firewall), prioritní podpory a pokročilých SSL certifikátů.
- Enterprise plán (individuální cena): Nejkomplexnější funkce, určené pro velké organizace s náročnými požadavky na výkon a bezpečnost.
Každý plán má různé úrovně služeb, které se mohou lišit podle potřeb zákazníka, přičemž bezplatný plán je ideální pro menší webové stránky nebo osobní projekty, zatímco placené plány jsou vhodné pro komerční a velké weby.