Technical audit · 06.09.2026

mil.ee

Estonian Defence Forces website

The Estonian Defence Forces website — a single capture across 11 pages, 506 requests, 12 nodes. Hygiene is high: a strict content security policy, the Cookiebot consent platform loads first and correctly blocks the real counters — Google Analytics, Tag Manager, DoubleClick and the Facebook pixel are permitted in the configuration but do not fire without consent. The leak is narrow and goes around that blocking: the embedded Facebook (post images on the homepage) and YouTube (thumbnails on the conscription page) feeds load automatically and send the visitor's IP address to Meta and Google in the US, while reCAPTCHA and Google Fonts start before consent. The browser meanwhile sent DNT: 1. The data-protection principles describe Facebook and YouTube as external links the visitor navigates to themselves, and promise processing of the IP address 'only in anonymised form'.

Request timeline

+0 ms · page load
Served via Cloudflare. Security headers are strict: a strict Content-Security-Policy (default-src 'self', script-src 'self' with a narrow allowlist), HSTS, Referrer-Policy strict-origin-when-cross-origin, X-Frame-Options SAMEORIGIN, X-Content-Type-Options nosniff. The browser sent DNT: 1.
+352 ms · reCAPTCHA and Cloudflare
www.google.com/recaptcha/enterprise.js and www.gstatic.com/recaptcha — reCAPTCHA Enterprise, transmission to Google; static.cloudflareinsights.com/beacon.min.js — a cookieless analytics beacon from the page markup. Both before any consent decision; marked as necessary in the cookie declaration.
+2948…+4216 ms · the embedded Facebook feed
scontent.ftll3-1.fna.fbcdn.net and scontent.ftll3-2.fna.fbcdn.net — post images from the embedded Facebook feed load automatically. The visitor's IP address goes to Meta (US). The Facebook pixel and the connect.facebook.net SDK are not loaded — these are direct image requests.
+752…+1211 ms · the embedded YouTube feed
www.googleapis.com/youtube/v3/playlistItems — a playlist request, then i.ytimg.com — video thumbnails. The IP address goes to Google (US). The youtube.com player is not loaded — the requests go for playlist data and images.
throughout the session · Google Fonts
fonts.gstatic.com — web fonts, loaded from stylesheets; the IP address goes to Google.

Declared versus actual

✓ Controller — Eesti Kaitsevägi; data-protection contact andmekaitse@mil.ee, mil@mil.ee, tel. 717 1155 — declared
✓ On visiting the site, the IP address, location, visit time and browser type are collected automatically — for visit statistics — declared
✓ 'IP-aadresse ei seota teabega, mis võimaldab isikut tuvastada. Andmeid töötleme üksnes isikustamata kujul' — IP addresses are not linked to identifying information; processing only in anonymised form — declared
✓ Google Analytics is used (collects the IP address, number of visitors, source, pages visited, time on site) — declared
✓ Facebook, Instagram, X are used under their providers' terms; on navigating via a link to these pages a third party collects data, visit information is only in anonymised form — declared
✓ YouTube is used under the provider's terms; on navigating via a link to the channel a third party collects data, information only in anonymised form — declared
✓ Spotify — under the provider's terms, as a channel via a link — declared
✓ The cookie declaration (Cookiebot) lists: __cf_bm (Cloudflare, necessary), rc::a (Google reCAPTCHA, necessary), CookieConsent (Cookiebot), YouTube cookies, Google Analytics — declared
✓ Supervisory authority — Andmekaitse Inspektsioon — declared
+ That the Facebook and YouTube feeds are embedded: the content loads automatically on visit, not only when a link is followed as described in the data-protection principles — not declared
+ The transfer of the visitor's IP address to Meta (US) via the Facebook feed images and to Google (US) via the YouTube feed — not disclosed and contradicts the wording 'only in anonymised form' — not declared
+ Google reCAPTCHA Enterprise — not named in the data-protection principles (only the rc::a cookie in the cookie declaration); loads before consent and transmits data to Google — not declared
+ Cloudflare — not named in the data-protection principles; the cookieless analytics beacon fires before consent — not declared
+ Google Fonts (fonts.gstatic.com) — not mentioned; the IP address goes to Google — not declared

Transfer timings

+142…+350 ms consent.cookiebot.com

Cookiebot, first on every page, receives dnt=true.

+352 ms www.google.com / www.gstatic.com

reCAPTCHA Enterprise before consent. In the cookie declaration — necessary (rc::a).

+352 ms static.cloudflareinsights.com

Cookieless analytics beacon from the markup, before consent.

+2948…+4216 ms scontent.*.fna.fbcdn.net

Images of the embedded Facebook feed on the homepage. IP address to Meta (US).

+752…+1211 ms www.googleapis.com / i.ytimg.com

Playlist API and thumbnails of the embedded YouTube feed on /ajateenistus/. IP address to Google (US).

No exact timing

whole capture Google Analytics, GTM, DoubleClick, Facebook pixelPermitted in the CSP but did not fire once — consent not given.
whole capture fonts.gstatic.comGoogle Fonts, IP address to Google.

Detected trackers

Indicators of GDPR non-compliance

Context

mil.ee is the official website of the Estonian Defence Forces (Kaitsevägi). The controller is Eesti Kaitsevägi; the data-protection contact is andmekaitse@mil.ee, with the general address mil@mil.ee. The site is served via Cloudflare and keeps a high bar at the header level: a strict Content-Security-Policy (default-src 'self', script-src 'self' with a narrow domain allowlist), HSTS, Referrer-Policy strict-origin-when-cross-origin, X-Frame-Options SAMEORIGIN, X-Content-Type-Options nosniff. Consent is managed by the Cookiebot platform.

The capture is a single recording across 11 pages: the homepage, the personal-data-processing page, the cookie page, the general section, the accessibility notice, and the conscription page /ajateenistus/. In total 506 requests, 12 nodes, about twelve minutes, recorded on 6 September 2026. Processing is described by the Kaitsevägi data-protection principles (updated 08.01.2025) and an automatic Cookiebot-based cookie declaration.

By today’s standards the profile is clean: the real counters are blocked, and the set of external requests is short. That is precisely why this audit comes down to a few narrow points rather than systemic tracking.

Who receives data directly

Google (reCAPTCHA, Fonts, YouTube), Meta (Facebook feed images), Cloudflare (analytics beacon). The real counters — Google Analytics, Tag Manager, DoubleClick, the Facebook pixel — are blocked until consent and did not fire in this capture.

Declared vs. actual

The site is built carefully, and this is worth stating plainly: the Cookiebot consent platform loads first on every page, and the script-based trackers — Google Analytics, Google Tag Manager, DoubleClick, the Facebook pixel — although permitted in the content security policy, did not fire once across the capture. Consent for statistics and marketing was not given, and the blocking worked. Against this backdrop the discrepancies are pinpointed.

First — embedded content bypasses the blocking. Cookiebot blocks third-party scripts, but not images. On the homepage, post images from the embedded Facebook feed (scontent.ftll3-1/2.fna.fbcdn.net) load automatically — the visitor’s IP address goes to Meta in the US. On the conscription page /ajateenistus/ an embedded YouTube feed runs: a request to the playlist API (www.googleapis.com/youtube/v3) and video thumbnails (i.ytimg.com) — the IP address goes to Google in the US. Neither the Facebook pixel nor the youtube.com player loads: these are direct requests for images and playlist data, and that is exactly why they bypass the script-based blocking.

Second — the description does not match the mechanics. The data-protection principles describe Facebook, Instagram, X and YouTube as external pages the visitor navigates to via a link: a third party collects the data ‘if you navigate via a link’ to those pages. But the content is embedded in the site’s own pages and loads on an ordinary visit, without any navigation. The difference is material: the document describes an action the user takes, whereas in reality the transfer happens automatically.

Third — the promise of anonymisation does not cover the transfer outward. The document states plainly that IP addresses are not linked to identifying information and are processed only in anonymised form. From the site’s own side this may be so, but the IP address sent to Meta and Google is not anonymised for those recipients — it is personal data that has gone to a third-party recipient in the US. The wording ‘only in anonymised form’ does not describe such a transfer.

Fourth — two recipients are not named in the principles themselves. Google reCAPTCHA Enterprise and Cloudflare are absent from the data-protection principles; they appear only in the automatic cookie declaration (rc::a, __cf_bm), where they are marked as necessary — distinguishing human from robot. For a bot-protection tool, loading before consent is defensible, and it is not recorded here as a violation in itself. But reCAPTCHA Enterprise transmits data to Google at +352 ms, and the visitor learns of this recipient nowhere in the data-protection principles.

Separately: the document states that Google Analytics is used, whereas in this capture the counter is in fact correctly blocked until consent. This is not a discrepancy against the site — rather the document describes the ‘with consent’ state, and the capture was taken without it.

Proven: the real counters are blocked. Across 11 pages and 506 requests there is not a single request to google-analytics.com, googletagmanager.com, doubleclick.net or the connect.facebook.net pixel — even though all of them are permitted in the content security policy. The Cookiebot platform loads first and gates them in the absence of consent.

Proven: the embedded content loads without consent. The Facebook feed images go out at +2948…+4216 ms on the homepage, the YouTube feed at +752…+1211 ms on the conscription page. There is no consent condition before these requests; the blocking does not extend to images.

Proven: the browser signalled a refusal to be tracked. The DNT: 1 header is present in 331 requests, and the Cookiebot platform received the dnt=true parameter. It had no effect on the embedded content.

Not proven, and not claimed: the operation of the real counters. How Google Analytics and its related scripts behave under this consent state, the capture cannot show — they did not load. The conclusion concerns only the content that actually loaded.

Observation boundaries

The capture covers 11 pages of the site and records browser behaviour, not the services’ internal workings: server-side processing and contracts with recipients are not verified by a browser-level capture. The recording contains one request to www.kv.ee (a price-statistics page) — this is a residual tab from a previous capture in the same browser; it has no relation to mil.ee and is not part of the audit. Service identification relies on domains and URL schemes: Google — by google.com/recaptcha, gstatic, googleapis/youtube and fonts.gstatic.com; Meta — by fbcdn.net; Cloudflare — by cloudflareinsights.com. The classification of reCAPTCHA and Cloudflare as necessary is taken from the site’s own cookie declaration.

The file is published redacted of personal data: cookie values in requests have been removed (Cookie headers are entirely absent from the recording, so the consent state is established not from cookies but from the fact that the script-based trackers were blocked). Response bodies and markup are preserved, so the load order, initiators and request parameters are verified directly against the published file.

The legal assessment is made by the competent authority — Andmekaitse Inspektsioon, to which the data-protection principles themselves refer.

Conclusion

The Defence Forces website is built carefully: a strict content security policy, and the Cookiebot consent platform loads first and genuinely blocks the real counters — Google Analytics, Tag Manager, DoubleClick and the Facebook pixel do not fire in the absence of consent. The problem is not with them, but with third-party content that is embedded as images and therefore bypasses the script-based blocking: the embedded Facebook feed on the homepage and the YouTube feed on the conscription page load automatically and send the visitor’s IP address to Meta and Google in the US. reCAPTCHA and Google Fonts start before consent, and the browser’s DNT: 1 is ignored.

At the same time the data-protection principles describe Facebook and YouTube as external pages the visitor navigates to themselves, and promise processing of the IP address ‘only in anonymised form’ — whereas the embedded content sends that address outward on an ordinary visit, without any navigation. Google reCAPTCHA and Cloudflare are not named in the principles themselves. For a government site, where a visitor to the conscription page is entitled to expect restraint, these points matter more than their short list would suggest.

Remediation: condition the loading of the embedded Facebook and YouTube feeds on consent (for example, via a facade placeholder that loads the content only on click), so that the IP address does not go to Meta and Google before consent; bring the data-protection principles into line with the mechanics — describe Facebook and YouTube as embedded content rather than as links, and disclose the transfer of the IP address to these recipients in the US; name Google reCAPTCHA and Cloudflare in the data-protection principles; and consider self-hosting fonts instead of fonts.gstatic.com so that the IP address does not go to Google.

Evidence

How to verify: download the file and compute its checksum — sha256sum file.har (Linux, macOS) or certutil -hashfile file.har SHA256 (Windows); it must match the one shown. The conclusions apply to the scope of this measurement — see the limitations of the method.

Original (audit)
HAR file: ee/mil-ee-2026-09-06.har
SHA-256: 1b1214a035dc1e7073698aca401836f6869507a45454926bfc26a08d8679f40b
Re-check snapshot
Awaiting changes
HAR files are stored on EU infrastructure (Proton Drive). SHA-256 is published for integrity verification.