[研究]AppScan報告_fbp (Cookie) 有【加密的階段作業 (SSL) Cookie 中遺漏安全屬性】弱點
2025-11-10
[研究]ASP.NET WebForm 網站用 AppScan 掃描發現【加密的階段作業 (SSL) Cookie 中遺漏安全屬性】
https://shaurong.blogspot.com/2025/10/aspnet-webform-appscan-ssl-cookie.html
********************************************************************************
AppScan 掃描 ASP.NET WebForm 報告下面弱點
加密的階段作業 (SSL) Cookie 中遺漏安全屬性
嚴重性: 中
實體: _fbp (Cookie)
風險: 有可能竊取在加密階段作業期間傳送的使用者和階段作業資訊 (Cookie)
原因: Web 應用程式會透過 SSL 傳送未受保護的 Cookie
修正: 新增 'Secure' 屬性至所有機密 Cookie
經查 _fbp (Cookie) 是下面程式碼產生,如何處理?
<!-- Facebook Pixel Code -->
<script>
!function (f, b, e, v, n, t, s) {
if (f.fbq) return; n = f.fbq = function () {
n.callMethod ?
n.callMethod.apply(n, arguments) : n.queue.push(arguments)
};
if (!f._fbq) f._fbq = n; n.push = n; n.loaded = !0; n.version = '2.0';
n.queue = []; t = b.createElement(e); t.async = !0;
t.src = v; s = b.getElementsByTagName(e)[0];
s.parentNode.insertBefore(t, s)
}(window, document, 'script',
'https://connect.facebook.net/en_US/fbevents.js');
fbq('init', '(略)');
fbq('track', 'PageView');
</script>
<noscript>
<img height="1" width="1" style="display: none"
src="https://www.facebook.com/tr?id=(略)&ev=PageView&noscript=1" />
</noscript>
<!-- End Facebook Pixel Code --> |
ChatGPT
AppScan finding:它把 _fbp(由 Facebook / Meta Pixel 在瀏覽器建立的追蹤 cookie)抓到「未標示 Secure 屬性」,因此在 HTTPS 傳輸時被視為一個中度風險(可能被攔截/竊取)。下面我用繁體中文把原因、可行解法、範例程式碼與優缺點列清楚,讓你可以直接採取或交辦給開發/資安團隊處理。
重點簡短結論
- _fbp 是由 Meta(Facebook)Pixel client-side JavaScript 所建立的 cookie,用於廣告/轉換追蹤。官方文件把 _fbp/_fbc 當成可用於 Conversions API 的瀏覽器 cookie 值。
- 你本身可以透過幾種方式處理這個 AppScan 警示:(A)移除或停用 Pixel(最直接)/(B)改以 server-side Conversions API(根本解)/(C)在 client 端覆寫 cookie,加上 Secure / SameSite(可快速緩解但非完美)/(D)若必須保留,可向資安接受風險並做文件化與例外。
為什麼會發生?
Meta Pixel 的 JS 在使用者瀏覽網站時以 document.cookie 建立 _fbp(first-party cookie)。原則上這種 cookie 是由外部 JS 設定的,所以它預設不會是 HttpOnly(JS 必須能讀寫),而 Secure 屬性也不是必然被加上。多個討論與提問指出,Pixel 本身通常不會把 Secure/HttpOnly 一併設好,因此掃描器會回報缺 Secure。
可行處理方案(優先順序 + 說明)
1) 最推薦:移除 client-side Pixel,改用 server-side Conversions API(或 hybrid)
- 用 server-side(或 server proxy / server GTM)把事件直接送到 Meta,這樣就不用在客戶端依賴 _fbp 來傳遞(或至少可減少依賴),能消除掃描器針對該 cookie 的警示來源,且通常更符合隱私/合規(可搭配同意管理)。
- 缺點:需後端/infra 改動、測試與驗證,開發成本較高。
2) 快速緩解:在頁面(Pixel 加載後)用 JavaScript 讀取並覆寫 _fbp,加上 Secure、SameSite=None(並設定 domain/path/expiry)
- 可在 fbq('init', ...) 之後短延遲覆寫 cookie,使 cookie 帶上 Secure 屬性,掃描器通常就會判定為「已標 Secure」。
- 優點:實作簡單、立刻降低掃描器警示。
- 缺點/風險:1) 無法把 cookie 設為 HttpOnly(因為要 JS 能讀寫,HttpOnly 就不可能); 2) Facebook 的 Pixel 或未來版本可能再覆寫 cookie(可能移除 Secure),所以要確保覆寫程式會在 Pixel 每次建立 cookie 後再次執行(例如在 load 後定時/重試幾次)。
下面給你可直接貼在 <head> 或 fbq('init',...) 之後的範例(繁中註解):
<script>
(function ensureFbpSecure(retries = 5, delay = 500) {
function setSecureFbp() {
try {
var name = '_fbp';
// 找出 _fbp 的值
var cookies = document.cookie.split('; ').filter(Boolean);
var found = cookies.find(function(c){ return c.indexOf(name + '=') === 0; });
if (!found) return false; // 尚未建立
var value = found.split('=').slice(1).join('=');
// 設定 expiry (例如 90 天),並覆寫同一 cookie,加入 Secure 與 SameSite=None
var expires = new Date(Date.now() + 90*24*60*60*1000).toUTCString();
// 不指定 domain(host-only)通常較安全,避免跨子網域問題;若你要跨子網域,可用 '.yourdomain.com'
document.cookie = name + '=' + value +
'; path=/; expires=' + expires +
'; Secure; SameSite=None';
return true;
} catch (e) {
return false;
}
}
// 嘗試覆寫,若尚未建立則重試幾次(Pixel 可能晚於本 script 執行)
if (!setSecureFbp() && retries > 0) {
setTimeout(function(){ ensureFbpSecure(retries - 1, delay); }, delay);
}
})();
</script>
|
注意事項:
- Secure 只有在 HTTPS 下有意義(你的 URL 已是 https)。
- SameSite=None 加上 Secure 是讓第三方/跨站情況下 cookie 可以被送出的組合(若你要廣告追蹤跨站)。
- 若你的網站有多個子網域、或要求 cookie 設在頂級 domain,可把 domain=.yourdomain.com 加回去,但要小心子網域權限問題。
3) 其他選項
- 覆寫 Pixel 原始程式:不建議直接改第三方供給的 JS,容易日後維護出問題。
- 例外/文件化風險:若確定無法移除或無法完全修正,可把掃描警示做為第三方 tracking cookie 的已知例外,並在資安風險接受文件中說明(含為何必須保留、減緩措施、同意收集流程等)。許多實務上會這樣處理,但要經由資安/法務同意。
要交給開發/資安團隊的建議(可直接 copy)
- 若業務允許:移除 client-side Facebook Pixel,改以 server-side Conversions API(或 server GTM)。由後端送事件到 Meta,減少或消除 _fbp 的需求與掃描器問題。實作參考 Meta 官方 Conversions API 文件與 server GTM 範例。https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/fbp-and-fbc/
- 若短期內無法改架構:在頁面(fbq('init', ...) 後)加入「覆寫 cookie 加 Secure」的 JS(上面給的 snippet),並在 QA 掃描後驗證 AppScan 是否仍報警。
- 對於合規/隱私:檢查 Cookie 同意機制(CMP)是否有攔截 Pixel,並確保用戶同意流程與 cookie policy/隱私聲明一致。https://www.facebook.com/business/help/471978536642445?id=1205376682832142
參考來源(你可以把這些貼到報告回覆)
- Meta 開發者:_fbp / _fbc 參數與用途(Conversions API docs)。https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/fbp-and-fbc/
- Facebook 開發者社群討論:是否能為 Pixel 設 Secure,與實務討論。https://developers.facebook.com/community/threads/1101977634208122/
- StackOverflow:Netsparker / pixel 對 _fbp 的 Secure/HttpOnly 問題討論(實務解法)。https://stackoverflow.com/questions/54768463/how-to-secure-and-validate-fbp-cookie
- Server-side Conversions API / sGTM 實作參考(可作為長期解)。https://stape.io/blog/how-to-set-up-facebook-conversion-api
(完)
沒有留言:
張貼留言