前一陣子看到新版 Firefox 102 版開始,可以讓使用者決定是不是要把網址中的一些 query parameters 過濾掉,常見的像是 facebook 的 id 追蹤 fbclid,還有 Google 的 ga_*, gclid 等;還有在追蹤活動時很常用的 utm_* 系列。如果這些足跡能在瀏覽網頁時去除掉,對於自己的隱私可以多一層保障。

所以,我也打算在 EinkBro 中來實作一下。這個功能主要可以分成兩部份:第一部份是取得哪些是應該要過濾掉的 query parameters,將它們用適當的方式儲存下來;第二部份才是透過跟網址比對,決定哪些參數需要清除,哪些是正常的,需要保留下來。

一開始,並沒有找到 Firefox 的實作方式,所以先在 Github 上找了其他 Open Source 的 repository 來參考。第一步是先將下面這個 Neat-URL 的資料納為己用:

GitHub - Smile4ever/Neat-URL: Neat URL cleans URLs, removing parameters such as Google Analytics’…

它的 Readme 中已經有列了很多常見的參數;有些是可以套在所有網站上的,有些是特定網站才會冒出來的參數。我先將這份 json 檔案存到了程式中,並且在 EinkBro 一開始執行的時候,就把下面的 params 存到了一個 List 中。每次要載入 url 時,都會去跟這些 params 做比較,如果有符合格式的話,就將其排除。

{  
    "categories": [  
        ...  
        { "name": "Amazon", "params": ["_encoding@amazon.*", "ascsubtag@amazon.*", "pd_rd_*@amazon.*", "pf@amazon.*", "pf_rd_*@amazon.*", "psc@amazon.*", "ref_@amazon.*", "tag@amazon.*"]},  
        { "name": "Bilibili.com", "params": ["callback@bilibili.com"]},  
        ...  
        { "name": "Campaign tracking (Google Analytics, ga)", "params": ["ga_*", "gclid", "gclsrc"]},  
        ...  
        { "name": "Facebook", "params": ["fb_action_ids", "fb_action_types", "fb_ref", "fb_source", "fbclid", "hrc@facebook.com", "refsrc@facebook.com"]},  
        { "name": "Google", "params": ["ei@google.*", "gs_gbg@google.*", "gs_l", "gs_lcp@google.*", "gs_mss@google.*", "gs_rn@google.*", "gws_rd@google.*", "sei@google.*", "ved@google.*"]},  
        { "name": "Medium", "params": ["_branch_match_id@medium.com", "source@medium.com"]},  
        ...  
    ]  
}

目前判斷的邏輯還沒全部完成,但至少通用型的參數,目前都可以過濾掉了。實做方式大致如下:

matchNeatUrlConfig

有了個別的參數比對函式後,再來是將 url string 分解成 Uri ,將裡頭的參數一個個拿出來做比較:

stripUrlQuery

Firefox 的實作

在套用 Neat Url 的作法時,我還是繼續想要找出 Firefox 的實作方式。原先以為它會是用 Android 的 kotlin 撰寫的,結果發現我的尋找方向錯誤:這功能實際上是用 C++ 開發的。

gecko-dev/URLQueryStringStripper.cpp at 90c03c4ae7ce45aed5dac97b6d65ec769305273f ·…

Brave 的實作

另外,也意外地找到了 Brave Browser 中的實作方式。但是,Brave Browser 的實作方式比較陽春就是了。

brave-core/brave_site_hacks_network_delegate_helper.cc at master · brave/brave-core

相關連結

目前實作已經都完成,主要的 commit 有下面三條

feat: support url query parameter stripping. basic function.

feat: filter query parameters by host too.

ui: add filter query parameter option in UI Behavior settings.