Dr Clèm's Blog

Tags: CSP Security Firefox Apache HTTP Server

How to set up Content Security Policy headers?

Tuesday Nov 21, 2017 04:45

I think a have a simple methodology to build Content Security Policy (CSP) headers. I did it with Apache HTTP Server and Firefox, but it is a generic methodology. I assume that you know what are CSP headers.

Before we start

First, you might want to disable most of your extensions. Indeed, some will add scripts or rewrite part of the displayed HTML code making it hard to distinguish warnings and errors form your code than from the extensions. I kept Test Pilot , Multi-Account Containers and Firefox Lightbeam by Mozilla, Privacy Badger and HTTPS Everywhere by the Electronic Frontier Foundation, and DuckDuckGo Plus by DuckDuckGo.

A useful tool

Laboratory by April King is an extension that allows you to record your website in order to provide a ready CSP header. But it is no fun and it does not push you think about how to rewrite some parts of website in order to improve security. You can also enforce CSP, which is useful if you add another component, for example if you add your Twitter timeline, you will need to adjust your CSP headers. With this tool, it is easy to check, try, add CSP headers, that you can later add to you web server. But for the purpose of this small how to, do not use this extension. If installed, please make sure that none of the check boxes are enabled and that Generated CSP configuration: is set to default-src 'none' if not, click on Delete All Settings or it will be a nightmare.

Laboratory extension

Always keep Developer Tools opened

Another step to avoid spend plenty of time looking at irrelevant answers on Stack Exchange is to open the Developer Tools, go on the options tab and check Disable HTTP Cache (when toolbox is open), and then keep it open at all time. Otherwise, some requests can be cached and you will not understand why your brand new configuration is not taking into account.

Building your CSP headers without blocking content
Report only

We will use the Content-Security-Policy-Report-Only header. When the web browser receive the content of a web page, it will display warnings for each violated CSP directive. We will see later that it can be used in a better way.

Be verbose

I strongly advise to add all possible directives to the header because any warning or error not related to an explicitly defined directive will be reported as violating default-src. This is because directives inherit from default-src if not explicitly set. If you only have something like default-src 'none'; style-src 'self';, then an unsafe-inline for script-src will be reported as violating default-src.

So our starting point will be default-src 'none'; child-src 'none'; connect-src 'none'; font-src 'none'; frame-src 'none'; img-src 'none'; manifest-src 'none'; media-src 'none'; object-src 'none'; script-src 'none'; style-src 'none'; worker-src 'none'; base-uri 'none'; frame-ancestors 'self'; and from this, we will allow one by one what we need.

Send report to your website

We will use a very nice feature of CSP, report-uri. It makes web browsers send a JavaScript Object Notation (JSON) file to the web server at the specified Uniform Resource Identifier (URI). This file will give you the basic instructions to build the correct CSP header. In my case, I created a folder /csp/ with the proper ownership and write rights containing one file index.php

// Start configure
$log_file dirname(__FILE__) . '/csp-violations.log';
$log_file_size_limit 1000000// bytes - once exceeded no further entries are added
// End configuration
$current_domain $_SERVER['SERVER_NAME'];
http_response_code(204); // HTTP 204 No Content
$json_data file_get_contents('php://input');
// We pretty print the JSON before adding it to the log file
if ($json_data json_decode($json_data)) {
$json_data json_encode($json_dataJSON_PRETTY_PRINT JSON_UNESCAPED_SLASHES);
// Do not write is file size exceeded
if (filesize($log_file) > $log_file_size_limit) {
file_put_contents($log_file$json_dataFILE_APPEND LOCK_EX);
It is a simplified and adapted version of the code you can find here. It will log errors and warnings in /csp/csp-violations.log.

All together

In your virtual host, add the following line

Header set Content-Security-Policy-Report-Only "report-uri /csp/; default-src 'none'; child-src 'none'; connect-src 'none'; font-src 'none'; frame-src 'none'; img-src 'none'; manifest-src 'none'; media-src 'none'; object-src 'none'; script-src 'none'; style-src 'none'; worker-src 'none'; base-uri 'none'; frame-ancestors 'self';"
Mind the ' and the ". The set of directives must start and end with ". All arguments of each directive must be surrounded by ' if, and only if, they are keywords. The corollary is do not use ' to surround Uniform Resource Locator (URL) and URI.

Restart Apache HTTP Server

# systemctl restart apache2


Visit your website. You should see in the Console tab of the Developer Tools.

In the /csp/ folder of you virtual host, you should see the csp-violations.log file. It contains lines like

     "csp-report": {
         "blocked-uri": "self",
         "document-uri": "https://clementfevrier.fr/images/r3.svg",
         "original-policy": "report-uri https://clementfevrier.fr/csp/ https://clementfevrier.fr/images/default-src https://clementfevrier.fr/images/'none'; child-src 'none'; connect-src 'none'; font-src 'none'; frame-src 'none'; img-src 'none'; manifest-src 'none'; media-src 'none'; object-src 'none'; script-src 'none'; style-src 'none'; worker-src 'none'",
         "referrer": "https://clementfevrier.fr/articles/11_rand.php",
         "script-sample": "onclick attribute on g element",
         "source-file": "https://clementfevrier.fr/images/r3.svg",
         "violated-directive": "script-src 'none'"
original-policy displays the CSP header. It is useful to ensure that it matches what you set in our web server. violated-directive tells you with directive you should adjust, in this example script-src and it also remind you its arguments 'none' because it is our starting point. blocked-uri tells you what it blocked, here it is self. So, you just need to replace script-src 'none' by script-src 'self' and the warning will disappear.

Repeat this for each violated directive.

Notice that without explicitly setting all directives, violated-directive will always report to default-src which makes it more difficult to debug.

For each directive that I set, I restart the web server, delete the log file, reload a page from my website in my web browser, and look at the new log.

Don't forget to check different pages of your web site to check all cases.

Your CSP log file does not report anymore violated directive? Let us add the real header.

Apply your CSP

Your header should look like

Header set Content-Security-Policy-Report-Only "report-uri /csp/; default-src 'none'; connect-src 'self'; font-src 'self'; frame-src 'none'; img-src 'self' data: https://toot.forumanalogue.fr; manifest-src 'none'; media-src 'self'; object-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; worker-src 'none'; base-uri 'none'; frame-ancestors 'self';
Just remove the -Report-Only and you are done.
Header set Content-Security-Policy "report-uri /csp/; default-src 'none'; connect-src 'self'; font-src 'self'; frame-src 'none'; img-src 'self' data: https://toot.forumanalogue.fr; manifest-src 'none'; media-src 'self'; object-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; worker-src 'none'; base-uri 'none'; frame-ancestors 'self';

Restart Apache HTTP Server

# systemctl restart apache2

Final checks

First, check that your website renders as you wish.

Then, there are couple of useful tools to perform checks on you CSP headers.

Check their recommendations and the links, they are full of useful informations.

As you can see, I still have to work to achieve a good CSP, but I know you to eliminate most of the so-called insecure inline code. I say so-called because for most of it, if not all of it, it is perfectly secure since I am not in the cases where it can be potentially insecure.

Changing you website and modifying your CSP headers

You can have both Content-Security-Policy-Report-Only and Content-Security-Policy at the time. It is useful to make a more restrictive CSP without blocking content. You can have one report-uri for the block content and one for the report only, which will simplify debugging.

Further reading

MDN Web Docs, by Mozilla, is the only website that I found with proper explanation and reference of CSP.

Mastodon Follow me Mastodon Share

Просто посмотри поможет
Posted by vidosikiCono on Tuesday Nov 05, 2019 07:08.
Приветик, что нового? А у меня интересная новость смотри
<a href=https://man-das.ru/video/m7D8Jxr79Mc>Какое защитное стекло выбрать? Сравнение всех видов стёкол на телефоны Xiaomi.</a>

Удачи пока, пока.
Posted by AllenGrart on Saturday Nov 09, 2019 23:22.
https://loveawake.ru - Знакомства Wei?enburg in Bayern. Сайт знакомств Wei?enburg in Bayern бесплатно, без регистрации, для серьезных отношений.
Posted by webmasterCono on Sunday Nov 10, 2019 03:28.
Творческие услуги и дизайн<br> У нас найдется множество заказов для всех креативных и творческих людей, которые не желают расставаться со своим талантом!<br> Здесь можно легко искать заказчиков по вот таким направления деятельности, как: <br>живопись, дизайн, чертёж и моделирование, полиграфия и верстка, создание маркет-китов, лого, брендбуков и не только!<br>Все очень просто - клиенты уже вас ждут, цены договорные.
<a href=http://bit.do/fdAMp>Много клиентов для бизнеса, получите бесплатно тестовую подписку. </a>
Порно спелой мамочки и молоденького сынули
Posted by Kara13ond on Monday Nov 11, 2019 02:54.
<a href=http://piccash.net/51575/871149/><img src="http://piccash.net/allimage/2018/10-6/img_thumb/871149-thumb.jpeg"></a>;
В годах мамаша так желала ебаться <a href=https://incest-home-video.ru/doter/493-mamulya-ohotno-masturbiruet-svoey-dochkehtml>мать дрочит дочке частное русское</a>
что захотела соблазнить родного сынишку для данного занятия. Сексуальная мамуля с длинными ляжками лобызает сыночку его писюн, онанирует его руками и собственными большими титьками, а после нежненько всовывает его в собственную восхитительную, влажную мохнатку, от чего познает неистовый кайф <a href=https://incest-home-video.ru/mamy/1920-young-guy-fucks-hot-grandma.html>сын кончает в мамину киску</a>
в прямом эфире...
Порно зрелой матери и восемнадцатилетнего сынишки посмотреть в full hd качестве
<a href=http://piccash.net/51575/871150/><img src="http://piccash.net/allimage/2018/10-6/img_thumb/871150-thumb.jpeg"></a>;
Не дорогие препараты
Posted by Mariavob on Monday Nov 11, 2019 04:59.
Доброго времени суток
Рекомендует врач
Очень дешевые препараты

<a href=https://anticancer24.ru/shop/353/desc/enbrel>этанерцепт инструкция +по применению</a>
Lucisun-сунитиниб от рака почки принимаю уже три месяца, идут улучшения
Posted by Laraseide on Wednesday Nov 13, 2019 10:31.
<a href=https://anticancer24.ru/shop/139/desc/lucisun50>LuciSun - дженерик Сутент (Sutent) - Sunitinib (Сунитиниб)</a> – это противоопухолевый препарат,
который был произведен на основе сунитиниба.
Препарат назначают людям с онкологическими заболеваниями,
при опухолевом процессе с метастатическими поражениями.
Основное действие препарата заключается в том,
что активное действующее вещество блокирует
тирокиназы – именно эти рецепторы отвечают за поддержание роста
опухоли. Благодаря препарату можно подавлять рост опухоли,
а процесс распространения метастаз постепенно тормозится.
<a href=https://anticancer24.ru/shop/139/desc/lucisun50>LuciSun - дженерик Сутент (Sutent ) - Sunitinib (Сунитиниб) купить</a> можно
на этом сайте – мы предлагаем качественную продукцию
по адекватным ценам.
Опытные специалисты расскажут всю информацию о производителе,
при необходимости предъявят сертификаты качества и предоставят
прочую актуальную информацию для потенциального покупателя.

Как принимать?
Принимать таблетки нужно орально, при этом пить их можно,
не связывая с приемом пищи.
Важно соблюдать одно условие: пить капсулы нужно в одно и то
время – чтобы в крови поддерживать оптимальный уровень
основного действующего вещества.
На <a href=https://anticancer24.ru/shop/139/desc/lucisun50>LuciSun - аналог Сутент (Sutent) - Sunitinib (Сунитиниб) цена</a>
колеблется, и этот фактор напрямую зависит от формы выпуска
У нас стоимость лекарства адекватная,
одна из самых низких – и это связано с тем,
что мы работаем напрямую с производителем.
Что касается дозировки, то для каждого пациента она индивидуальная.
Как правило, доза зависит от общего самочувствия,
сложности заболевания и его запущенности,
сопутствующих недугов.
Все эти факторы учитывает врач-онколог при назначении
Стандартная дозировка подразумевает ежедневное применение
пациентом 50 мг лекарства.
Что касается курса – 4 недели человек должен пить таблетки,
спустя 2 недели нужно сделать перерыв.
При необходимости терапию возобновляют вновь.
Про <a href=https://anticancer24.ru/shop/139/desc/lucisun50>LuciSun - аналог Сутент (Sutent) - Sunitinib (Сунитиниб) отзывы</a>
Пациенты, проходившие лечение с применением этого средства,
утверждают, что при корректно подобранной дозировке побочные
эффекты отсутствуют, лекарство переносится хорошо,
а терапия дает положительные результаты.

Онкология – не приговор!
Благодаря тому, что наука уверенно идет вперед,
ученым удается с каждым годом создавать все новые и новые
препараты, благодаря которым можно приостановить рост опухоли.
На <a href=https://anticancer24.ru/shop/139/desc/lucisun50>LuciSun - дженерик Сутент (Sutent) - Sunitinib (Сунитиниб) стоимость</a>
– высокая, но лекарство того стоит.
Оно является эффективным, препарат прошел множество
клинических испытаний, и все они подтверждают – средство
является действительно эффективным.
Причем если проводить химио- либо лучевую терапию – в некоторых
случаях она является неэффективной.
Мало того, облучение крайне негативно действует на все
органы и системы организма.
У таблеток, конечно, имеются негативные побочные эффекты,
но проявляют себя они крайне редко, и никак не сравнятся
с побочками, которые возникают после проведения химиотерапии.

<a href=https://anticancer24.ru/shop/139/desc/lucisun50>купить сутент 50 мг</a>
Unlimited Movies Netflix & CBO - Free trial
Posted by EdithVup on Wednesday Nov 13, 2019 13:21.
LIMITED PROMOTION Get 6 months free Trial Subscription for Netflix and CBO to watch unlimited movies
Take your trial now at: https://giveawaylimited.com/movies
Posted by websiteCono on Thursday Nov 14, 2019 01:25.
Кто может помочь с созданием простого сайта на html5 и css3 ?<br>Оплата по договоренности. <a href=https://poisk.female-ru.ru>подробнее...</a>;

Помогите,кто разбирается в сайтостроении
Как правильно выбрать
Posted by vidosiki-Cono on Sunday Nov 17, 2019 14:17.
Hello how are you! Клёвый видосик
<a href=https://info-sovety.ru/video/mHszsvKE-0c>Как придать уверенность в себе - советы психолога</a>

Всем пока!
Posted by AlbinaGrart on Sunday Nov 17, 2019 19:32.

Unlimited Movies Netflix & CBO - Free trial
Posted by EdithVup on Monday Nov 18, 2019 11:26.
LIMITED PROMOTION Get 6 months free Trial Subscription for Netflix and CBO to watch unlimited movies
Take your trial now at: https://giveawaylimited.com/movies
Cоветы выбираем
Posted by vidosiki-Cono on Wednesday Nov 20, 2019 17:46.
Приветики ребята! Посмотри жуткая вещь...
<a href=https://kok7.ru/video/NQCHlXrePVQ>Как проверить автомобиль при покупке.</a>

Пока, пока!
Twitter hack account
Posted by KennyFak on Wednesday Nov 20, 2019 18:39.
Twitter hack
Hack Twitter
Twitter hacking
Twitter account hack
Twitter hack account
hacking Twitter
Twitter password hack
Twitter hack account
hack Twitter account
Twitter password
Twitter crack
Twitter password hackin
Unlimited Movie free trial
Posted by EdithVup on Friday Nov 22, 2019 22:45.
Get 1 Year Trial Subscription for Netflix and CBO to watch unlimited movies for free for 6 months.
Take your trial now at: https://giveawaylimited.com/movies
pay to write psychology annotated bibliography
Posted by HollyOperb on Tuesday Nov 26, 2019 23:50.
Only for you....
<a href=https://spoilessay.com/a-become-essays-for-teacher-to-wanting/best-scholarship-essay-editor-for-hire-for-mba.php>Best scholarship essay editor for hire for mba</a>
custom biography editor for hire us
<a href="https://essaywritingnow.com/a-about-edition-essay-fourth-guide-literature-sheet-style-writing/cheap-academic-essay-editing-sites-us.php">Cheap academic essay editing sites us</a>
write me top critical essay on usa
Металлические дверцы
Posted by lukiKeero on Monday Dec 02, 2019 19:54.
<a href=http://www.alkraft.ru/lyuki-pod-plitku>люк под плитку нажимной люк невидимка</a> или <a href=http://www.alkraft.ru/>люк напольный съемный</a>

Смотри тут всё интересное
Posted by vidosiki-Cono on Thursday Dec 05, 2019 02:20.
Приветик, что нового? А у меня интересная новость смотри
<a href=https://kok7.ru/video/m0a6fDwTLLU>Гениальный рецепт из СССР! Улучшение кровообращения, укрепление сосудов и сердца Про здоровье</a>

А теперь пока, пока...
Доктор рекомендовал аптеку с низкими ценами и качественными препаратами
Posted by Heatherdaw on Friday Dec 06, 2019 05:29.
Доктор порекомендовал данный препарат и он очень хорошо помог!

<a href=https://india-express.net/shop/118/desc/palbociclib>палбоциклиб ибранса</a>
Очень хочу пообщаться с молодым человеком
Posted by Hollispaf on Friday Dec 06, 2019 20:24.
Мое имя Натусик.
Познакомлюсь с парнем для встречи. Приеду к тебе на район или встримся у меня. Живу совсем близко.

<a href=http://thrifermilvi.tk/g8qg>Спорим понравлюсь?</a>
Трастовые домены-доноры с хорошей посещаемостью
Posted by GoodSeoT on Sunday Dec 08, 2019 04:05.
Здравствуйте. Предлагаю Вашему вниманию трастовые домены-доноры с высокой посещаемостью для размещения ссылок Вашего сайта у нас.
Все сайты качественные, без фильтров и санкций со стороны поисковых систем. Присутствуют на биржах ссылок miralinks, gogetlinks и других.

Разместив у нас сайт Вы получите:

- хороший траст
- нулевой уровень заспамленности сайтов
- более 400 000 уникальных посещений в месяц
- цены ниже чем на биржах ссылок
- максимально быстрое размещение
- все ссылки индексируются поисковыми системами
- гарантия на вечное размещение ссылки
- ссылки размещаются на видном месте, без всяких хитростей

Более детальную информацию Вы сможете посмотреть по ссылке на google документ ниже:

Vêtements et accessoires pour femmes du Royaume-Uni
Posted by JimmyTef on Wednesday Dec 11, 2019 02:47.
Vêtements et accessoires pour femmes du Royaume-Uni
https://fas.st/-8K5a - Vêtements et accessoires pour femmes du Royaume-Uni>>>
Posted by Website let on Wednesday Dec 11, 2019 03:28.
Друзья, посоветуйте проверенного человека по созданию или восстановлению сайта! <a href=https://poisk.female-ru.ru>подробнее...</a>;

Помогите IT специалисты
Dr Clément Février

I am Dr Clément Février, French, living in Grenoble. I defended my PhD on July 4th, 2016. After my defense I run as deputy deputy (not a typo) for the national parliamentary elections in the 1st circonscription of Isère for the political movement La France Insoumise.

Ça se passe dans l'Ain (entre autre). La France n'a pas les moyens de mettre 10000€ pour faire une enquête sur des malformations de bébés, on doit vraiment être un des pays les plus pauvre de la planète. L'État abandonnait déjà les vieux avec les retraites (ça coûte trop cher), la santé (ça coûte trop cher), la sécurité (ça coûte trop cher), la recherche (ça coûte trop cher), les pauvres (ça coûte trop cher), l'environnement (ça coûte trop cher),


"Les états-unis [gentil] aurait espionner Assange [méchant]" (sauf dans Médiapart)
"Durant la manifestation, 15 policiers ont été gravement blessés par des projectiles a base d’œufs et de farines lancés par les manifestants, désigné de "ultra" par le gouvernement, et 12 manifestants auraient été légèrement blessés par des projectiles de provenances inconnus"

Si le gentil est accusé d'une exaction, alors non seulement le conditionnel est utilisé, mais en plus, les propos sont rapportés par le méchant. Exemple : "Selon [gilet jaune/Erdogan/Putin/Trump], le [gouvernement/kurdes/USA/UnPeuToutLeMonde] aurait fait un truc mal."
"Selon Erdogan [méchant], le PKK [gentil] est a l'origine de l'attaque suicide qui a tué des dizaines de civiles sur la place public."
"Erdogan [méchant] a lancé l'offensive contre les kurdes [gentils]"

"Gilet jaune blessé : les "selon" du 20 Heures" par Arrêt sur Images.

Maintenant, regardez n'importe quel article, si le conditionnel est utilisé sauf pour les exactions, où le présent de vérité général est utilisé, alors c'est un méchant/ennemis/terroriste/"ultra"/dictateur/..., si au contraire, le présent de vérité général est utilisé par défaut, alors c'est un gentil.