Autor Zpráva
radekt
Profil
Dobrý den,
mám tuto bezpečnostní hlavičku:

header("Content-Security-Policy: default-src 'self'; font-src 'self'; img-src 'self'; script-src 'self' https://www.google-analytics.com https://apis.google.com; style-src 'self'");

podle návodu na www.slideshare.net/spaze/xss-php-csp-beef. Jestli jsem to dobře pochopil, tak default-src 'self' je nejpříšnější instrukce, která povoluje skripty, obrázky, styly atd. jen z vlastního webu a následující podmínky ji změkčují výjimkami. Nicméně pokud mám bezp. hlavičku takto, nezobrazí se tlačítko Google+ a Like tlačítko od Facebooku.

Když vypustím default-src 'self':

header("Content-Security-Policy: font-src 'self'; img-src 'self'; script-src 'self' https://www.google-analytics.com https://apis.google.com; style-src 'self'");

tak se tlačítko Google+ a Like tlačítko od Facebooku zobrazí. Čímž je problém vyřešen, ale stejně by mě zajímalo, proč tomu tak je.

A proč se v prvním případě schová i FB tlačítko? Vždyť nevolá javascript, ale php (www.facebook.com/plugins/like.php...), čemuž nasvědčuje i to, že se v bezpečnostní hlavičce nemusí povolovat žádná stránka FB.

Díky
Keeehi
Profil
Content-Security-Policy: default-src 'self'; font-src 'self'; img-src 'self'; script-src 'self' https://www.google-analytics.com https://apis.google.com; style-src 'self'
By mělo být ekvivalentní
Content-Security-Policy: default-src 'self'; script-src 'self' https://www.google-analytics.com https://apis.google.com
default-src udává přednastavenou hodnotu pro ty, které se nevyjmenují. Takže font-src img-src a style-src můžeš vypustit.

Když vynecháš default-src, tak aby jsi to měl bezpečné, musíš uvést všechny ostatní které by jinak jeho hodnotu přebíraly. Tedy font-src img-src a style-src. To však nejsou všechny! Dále connect-src object-src media-src frame-src(zastaralá) child-src a možná ještě form-action a frame-ancestors.
default-src tam určitě nechej. Jelikož se tlačítka nezobrazují, tak jsi nejspíše vyjmenoval málo domén (pro FB jsi nevyjmenoval jedinu) v script-src a nebo nejspíše taky v img-src (čekal bych že ta tlačítka budou obrázková ale nemusí to tak být).
Jaké přesně zdroje se snaží stránka načíst uvidíš ve vývojářských nástrojích prohlížeče.

radekt:
A proč se v prvním případě schová i FB tlačítko? Vždyť nevolá javascript, ale php
PHP se možná volá ale javascriptem.
radekt
Profil
Keeehi:
Ano a rád bych to takto použil, ale i pro tuto optimalizovanou variantu platí to, že se nezobrazí tlačítko Google+ a Like tlačítko od Facebooku.

PHP se možná volá ale javascriptem.
Spíše FB php skript pak možná volá javascript, těžko říci.
Keeehi
Profil
radekt:
Ano a rád bych to takto použil, ale i pro tuto optimalizovanou variantu platí to, že se nezobrazí tlačítko Google+ a Like tlačítko od Facebooku.
To je očekávané chování, když ty zápisy jsou ekvivalentní.

My to za tebe nevyřešíme, jelikož jsi nám nedal odkaz na stránku. Takže buď si ve vývojářský nástrojích najdi, co a proč prohlížeč blokuje -> a pak to přidej do csp;
nebo využij služeb report-uri.io, nastav si na ně report-uri a zablokované zdroje si najdeš tam. Výsledek zase je, až to zjistíš, co je blokované, tak to přidej do csp.

Poznámka - s momentálním nastavením nefungují scripty co jsou na stránce (a je to tak správně). Všechny javascripty musejí být v souborech, které do stránky vkládají.
radekt
Profil
Keeehi:
Je to tato stránka.

mám tam:
header("Content-Security-Policy: default-src 'self'; script-src 'self' https://www.google-analytics.com https://apis.google.com https://toplist.cz;");

MSIE11 tlačítko Google+ a FB Like tlačítko zobrazuje, Chrome a Firefox ne.
radekt
Profil
Nakonec se mi to podařilo - díky za tip na vývojářské nástroje - takto (pro lepší přehled zde na diskusi jsem rozsekal kód na více řádků):
header("Content-Security-Policy:
default-src 'self';
frame-src https://accounts.google.com https://apis.google.com http://www.facebook.com;
img-src 'self' https://toplist.cz;
script-src 'self' 'unsafe-inline' https://www.google-analytics.com https://apis.google.com https://toplist.cz;
style-src 'self' 'unsafe-inline' https://apis.google.com");

Díky za nakopnutí správným směrem.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: