You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit cf7a9a1
Browse filesBrowse the repository at this point in the historyBrowse files
fix: count sites instead of hostnames in public_hash_list (#357)
* feat: add sync_public_suffix_private task to crawl_complete DAG
Signed-off-by: Max Ostapenko <1611259+max-ostapenko@users.noreply.github.com>
* refactor: expand public suffix list synchronization to include ICANN domains and exception rules
Signed-off-by: Max Ostapenko <1611259+max-ostapenko@users.noreply.github.com>
* docs: update documentation to reflect Airflow orchestration for pipelines
Signed-off-by: Max Ostapenko <1611259+max-ostapenko@users.noreply.github.com>
* fix: count sites instead of hostnames in public_hash_list
The >=100 threshold counted distinct hostnames of the resource URL, so a
resource used only on many subdomains of one site (for example
$city.$vulnerable-group.com) passed the privacy gate. Count distinct
sites (eTLD+1 of the embedding page) using the full Public Suffix List,
including the private section that BigQuery's NET.PUBLIC_SUFFIX() skips.
The private rules come from the urls.public_suffix_list table, which the
crawl_complete DAG keeps current.
---------
Signed-off-by: Max Ostapenko <1611259+max-ostapenko@users.noreply.github.com>
Co-authored-by: Max Ostapenko <1611259+max-ostapenko@users.noreply.github.com>
Copy file name to clipboardExpand all lines: definitions/output/performance/public_hash_list.js
+98-13Lines changed: 98 additions & 13 deletions
Original file line number
Diff line number
Diff line change
@@ -1,30 +1,40 @@
1
1
publish('public_hash_list',{
2
2
type: 'table',
3
3
schema: 'performance',
4
-
description: `Identifies web resources (scripts, CSS, fonts, WASM) whose SHA-256 body hash appears across >=100 independent origins in the HTTP Archive monthly crawl.
5
-
The >=100-origins threshold is the k-anonymity privacy gate: a resource that widespread cannot serve as a cross-site identifier.
6
-
Traffic-weighted score: each hash is scored by SUM(100000 / min_rank) across origins, where min_rank is the CrUX popularity bucket of the hosting page (1 000 = top 1K sites -> 100 pts; 1 000 000 = top 1M -> 0.1 pt). This lifts hashes carried by high-traffic pages to the top of the list.
4
+
description: `Identifies web resources (scripts, CSS, fonts, WASM) whose SHA-256 body hash appears across >=100 independent sites in the HTTP Archive monthly crawl.
5
+
A site is the registrable domain (eTLD+1) of the embedding page, computed with the full Public Suffix List (ICANN and private sections), so city1.example.com and city2.example.com count as the single site example.com, while alice.github.io and bob.github.io count as two sites.
6
+
The >=100-sites threshold is the k-anonymity privacy gate: a resource that widespread cannot serve as a cross-site identifier.
7
+
Traffic-weighted score: each hash is scored by SUM(100000 / min_rank) across sites, where min_rank is the CrUX popularity bucket of the site's most popular embedding page (1 000 = top 1K sites -> 100 pts; 1 000 000 = top 1M -> 0.1 pt). This lifts hashes carried by high-traffic pages to the top of the list.
7
8
Results are published as a world-readable Google Sheet: https://docs.google.com/spreadsheets/d/1Cw4wguQ0X4xMqZlTRYlo6OHQaUr7UVYlFZaIQkXK2Jw/edit?usp=sharing
8
9
The CSV export used by http-archive.js: https://docs.google.com/spreadsheets/d/e/2PACX-1vTOcTespiVHDRLIq16_3GsnnvJmut00x0fzWTLXSWBNya6Go_1kBrGoVJvxb8gEaP_L9FfKmXy3-kF-/pub?output=csv
0 commit comments