<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Redaction on Tarragon</title><link>https://tarrragon.github.io/blog/tags/redaction/</link><description>Recent content in Redaction on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Fri, 19 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/redaction/index.xml" rel="self" type="application/rss+xml"/><item><title>SDK Redaction API 設計</title><link>https://tarrragon.github.io/blog/monitoring/07-security-privacy/sdk-redaction-api/</link><pubDate>Fri, 19 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/monitoring/07-security-privacy/sdk-redaction-api/</guid><description>&lt;p>Redaction 是在事件資料離開 client 之前，把敏感欄位的值替換成遮罩或移除。本章聚焦 redaction 的策略面 — 哪些資訊需要保護、保護的判斷依據和適用範圍。SDK 的 API 實作細節（初始化方式、helper 函式設計、和 flush 管線的整合）見 &lt;a href="https://tarrragon.github.io/blog/monitoring/03-sdk-design/redaction-helper/" data-link-title="SDK redaction helper" data-link-desc="在事件離開 SDK 前移除敏感資訊 — 預設 redaction rule 處理常見 pattern，自訂 rule 處理業務特定的 secret">SDK redaction helper&lt;/a>。Redaction 在 SDK 端執行的設計原則是「敏感資料不離開 client」— 一旦資料送到 collector，即使 collector 有 access control，資料已經在網路上傳輸過，多了一層洩漏面。&lt;/p>
&lt;h2 id="預設-redaction-rule">預設 Redaction Rule&lt;/h2>
&lt;p>SDK 內建的 redaction rule 覆蓋最常見的敏感欄位模式。開發者不需要設定就能獲得基本保護。&lt;/p>
&lt;h3 id="欄位名稱比對">欄位名稱比對&lt;/h3>
&lt;p>以下欄位名稱（不分大小寫）的值自動替換為 &lt;code>[REDACTED]&lt;/code>：&lt;/p>
&lt;ul>
&lt;li>&lt;code>password&lt;/code>、&lt;code>passwd&lt;/code>、&lt;code>secret&lt;/code>、&lt;code>token&lt;/code>、&lt;code>api_key&lt;/code>、&lt;code>apiKey&lt;/code>&lt;/li>
&lt;li>&lt;code>authorization&lt;/code>、&lt;code>auth&lt;/code>、&lt;code>credential&lt;/code>&lt;/li>
&lt;li>&lt;code>ssn&lt;/code>、&lt;code>social_security&lt;/code>&lt;/li>
&lt;li>&lt;code>credit_card&lt;/code>、&lt;code>card_number&lt;/code>、&lt;code>cvv&lt;/code>、&lt;code>cvc&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>欄位名稱比對用 substring match — &lt;code>user_password&lt;/code> 包含 &lt;code>password&lt;/code> 會被 redact，&lt;code>password_reset_token&lt;/code> 包含 &lt;code>password&lt;/code> 和 &lt;code>token&lt;/code> 也會。&lt;/p>
&lt;h3 id="值格式比對">值格式比對&lt;/h3>
&lt;p>以下格式的值無論欄位名稱為何都自動替換：&lt;/p>
&lt;ul>
&lt;li>Email 地址格式（&lt;code>user@domain.com&lt;/code> → &lt;code>u***@domain.com&lt;/code>）&lt;/li>
&lt;li>信用卡號碼格式（連續 13-19 位數字 → 保留末四碼）&lt;/li>
&lt;li>Bearer token 格式（&lt;code>Bearer xxx&lt;/code> → &lt;code>Bearer [REDACTED]&lt;/code>）&lt;/li>
&lt;/ul>
&lt;p>值格式比對用正則表達式。正則的效能影響在大量事件時需要注意 — 預設 rule 的正則保持簡單，避免 catastrophic backtracking。&lt;/p>
&lt;h2 id="自訂-pattern">自訂 Pattern&lt;/h2>
&lt;p>應用可能有自己的 secret 格式，預設 rule 覆蓋不到。SDK 提供 API 讓開發者註冊自訂 redaction pattern。&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="ln"> 1&lt;/span>&lt;span class="cl">monitor.addRedactionRule(
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 2&lt;/span>&lt;span class="cl"> name: &amp;#39;internal-api-key&amp;#39;,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 3&lt;/span>&lt;span class="cl"> pattern: RegExp(r&amp;#39;sk_live_[a-zA-Z0-9]{24}&amp;#39;),
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 4&lt;/span>&lt;span class="cl"> replacement: &amp;#39;[REDACTED:api-key]&amp;#39;,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 5&lt;/span>&lt;span class="cl">)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 6&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 7&lt;/span>&lt;span class="cl">monitor.addRedactionRule(
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 8&lt;/span>&lt;span class="cl"> name: &amp;#39;database-url&amp;#39;,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 9&lt;/span>&lt;span class="cl"> fieldNames: [&amp;#39;database_url&amp;#39;, &amp;#39;db_url&amp;#39;, &amp;#39;connection_string&amp;#39;],
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">10&lt;/span>&lt;span class="cl"> replacement: &amp;#39;[REDACTED:db-url]&amp;#39;,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">11&lt;/span>&lt;span class="cl">)&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>自訂 pattern 的設計考量：&lt;/p>
&lt;p>&lt;strong>Pattern 在 init 時註冊&lt;/strong>。Redaction rule 在 SDK 初始化時設定，之後所有事件都通過這些 rule。不支援動態修改 — 避免「中途加 rule 導致之前的事件沒被 redact」的困惑。&lt;/p>
&lt;p>&lt;strong>Pattern 順序無關&lt;/strong>。所有 rule 獨立執行，不依賴順序。一個欄位可以匹配多個 rule，以第一個匹配的 replacement 為準。&lt;/p>
&lt;p>&lt;strong>Replacement 可以保留部分資訊&lt;/strong>。&lt;code>[REDACTED]&lt;/code> 完全遮蔽，&lt;code>[REDACTED:api-key]&lt;/code> 保留類型資訊，&lt;code>u***@domain.com&lt;/code> 保留結構。保留類型資訊對 debug 有幫助 — 看到 &lt;code>[REDACTED:api-key]&lt;/code> 至少知道這裡原本有一個 API key。&lt;/p>
&lt;h2 id="redaction-的適用範圍">Redaction 的適用範圍&lt;/h2>
&lt;p>Redaction 應用在 SDK 送出事件前的最後一步 — 在序列化（JSON encode）之前。適用範圍包括：&lt;/p>
&lt;ul>
&lt;li>Event 的 data 欄位（自由欄位，開發者可能放入任何內容）&lt;/li>
&lt;li>Error 的 stack trace（檔案路徑可能包含使用者名稱或部署路徑）&lt;/li>
&lt;li>Error 的 message（例外訊息可能包含 query string 或參數值）&lt;/li>
&lt;li>Lifecycle 的 metadata（連線 URL 可能包含認證資訊）&lt;/li>
&lt;/ul>
&lt;p>Redaction 不應用在 SDK 的內部欄位（timestamp、event type、session ID）— 這些是 SDK 自己產生的，不包含使用者資料。&lt;/p></description><content:encoded><![CDATA[<p>Redaction 是在事件資料離開 client 之前，把敏感欄位的值替換成遮罩或移除。本章聚焦 redaction 的策略面 — 哪些資訊需要保護、保護的判斷依據和適用範圍。SDK 的 API 實作細節（初始化方式、helper 函式設計、和 flush 管線的整合）見 <a href="/blog/monitoring/03-sdk-design/redaction-helper/" data-link-title="SDK redaction helper" data-link-desc="在事件離開 SDK 前移除敏感資訊 — 預設 redaction rule 處理常見 pattern，自訂 rule 處理業務特定的 secret">SDK redaction helper</a>。Redaction 在 SDK 端執行的設計原則是「敏感資料不離開 client」— 一旦資料送到 collector，即使 collector 有 access control，資料已經在網路上傳輸過，多了一層洩漏面。</p>
<h2 id="預設-redaction-rule">預設 Redaction Rule</h2>
<p>SDK 內建的 redaction rule 覆蓋最常見的敏感欄位模式。開發者不需要設定就能獲得基本保護。</p>
<h3 id="欄位名稱比對">欄位名稱比對</h3>
<p>以下欄位名稱（不分大小寫）的值自動替換為 <code>[REDACTED]</code>：</p>
<ul>
<li><code>password</code>、<code>passwd</code>、<code>secret</code>、<code>token</code>、<code>api_key</code>、<code>apiKey</code></li>
<li><code>authorization</code>、<code>auth</code>、<code>credential</code></li>
<li><code>ssn</code>、<code>social_security</code></li>
<li><code>credit_card</code>、<code>card_number</code>、<code>cvv</code>、<code>cvc</code></li>
</ul>
<p>欄位名稱比對用 substring match — <code>user_password</code> 包含 <code>password</code> 會被 redact，<code>password_reset_token</code> 包含 <code>password</code> 和 <code>token</code> 也會。</p>
<h3 id="值格式比對">值格式比對</h3>
<p>以下格式的值無論欄位名稱為何都自動替換：</p>
<ul>
<li>Email 地址格式（<code>user@domain.com</code> → <code>u***@domain.com</code>）</li>
<li>信用卡號碼格式（連續 13-19 位數字 → 保留末四碼）</li>
<li>Bearer token 格式（<code>Bearer xxx</code> → <code>Bearer [REDACTED]</code>）</li>
</ul>
<p>值格式比對用正則表達式。正則的效能影響在大量事件時需要注意 — 預設 rule 的正則保持簡單，避免 catastrophic backtracking。</p>
<h2 id="自訂-pattern">自訂 Pattern</h2>
<p>應用可能有自己的 secret 格式，預設 rule 覆蓋不到。SDK 提供 API 讓開發者註冊自訂 redaction pattern。</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln"> 1</span><span class="cl">monitor.addRedactionRule(
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">  name: &#39;internal-api-key&#39;,
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">  pattern: RegExp(r&#39;sk_live_[a-zA-Z0-9]{24}&#39;),
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">  replacement: &#39;[REDACTED:api-key]&#39;,
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">)
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">monitor.addRedactionRule(
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">  name: &#39;database-url&#39;,
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">  fieldNames: [&#39;database_url&#39;, &#39;db_url&#39;, &#39;connection_string&#39;],
</span></span><span class="line"><span class="ln">10</span><span class="cl">  replacement: &#39;[REDACTED:db-url]&#39;,
</span></span><span class="line"><span class="ln">11</span><span class="cl">)</span></span></code></pre></div><p>自訂 pattern 的設計考量：</p>
<p><strong>Pattern 在 init 時註冊</strong>。Redaction rule 在 SDK 初始化時設定，之後所有事件都通過這些 rule。不支援動態修改 — 避免「中途加 rule 導致之前的事件沒被 redact」的困惑。</p>
<p><strong>Pattern 順序無關</strong>。所有 rule 獨立執行，不依賴順序。一個欄位可以匹配多個 rule，以第一個匹配的 replacement 為準。</p>
<p><strong>Replacement 可以保留部分資訊</strong>。<code>[REDACTED]</code> 完全遮蔽，<code>[REDACTED:api-key]</code> 保留類型資訊，<code>u***@domain.com</code> 保留結構。保留類型資訊對 debug 有幫助 — 看到 <code>[REDACTED:api-key]</code> 至少知道這裡原本有一個 API key。</p>
<h2 id="redaction-的適用範圍">Redaction 的適用範圍</h2>
<p>Redaction 應用在 SDK 送出事件前的最後一步 — 在序列化（JSON encode）之前。適用範圍包括：</p>
<ul>
<li>Event 的 data 欄位（自由欄位，開發者可能放入任何內容）</li>
<li>Error 的 stack trace（檔案路徑可能包含使用者名稱或部署路徑）</li>
<li>Error 的 message（例外訊息可能包含 query string 或參數值）</li>
<li>Lifecycle 的 metadata（連線 URL 可能包含認證資訊）</li>
</ul>
<p>Redaction 不應用在 SDK 的內部欄位（timestamp、event type、session ID）— 這些是 SDK 自己產生的，不包含使用者資料。</p>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>資料離開 client 後的保護 → <a href="/blog/monitoring/07-security-privacy/transport-security/" data-link-title="Transport 安全" data-link-desc="HTTPS / basic auth / 同區網也要加密的理由 — 監控資料在傳輸途中的保護機制">Transport 安全</a></li>
<li>去識別化策略 → <a href="/blog/monitoring/07-security-privacy/anonymization-strategy/" data-link-title="去識別化策略" data-link-desc="IP 截斷 / user agent 簡化 / stack trace 路徑清理 / session UUID — 四種去識別化技術的適用場景和實作方式">去識別化策略</a></li>
<li>IME 個人化學習的 secret 洩漏風險 → <a href="/blog/ux-design/03-input-mechanism/ime-security-checklist/" data-link-title="安全敏感輸入框的 IME 控制 checklist" data-link-desc="處理密碼、API key、伺服器路徑等 secret 的輸入框需要關閉 IME 的個人化學習和自動校正 — 安全要求而非 UX 偏好">ux-design 模組三 IME 安全 checklist</a></li>
</ul>
]]></content:encoded></item><item><title>Redaction</title><link>https://tarrragon.github.io/blog/monitoring/knowledge-cards/redaction/</link><pubDate>Fri, 19 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/monitoring/knowledge-cards/redaction/</guid><description>&lt;p>Redaction 的核心概念是「在事件資料離開 client 之前，把敏感欄位的值替換成遮罩或移除」。密碼、API key、個人識別資訊在送到 collector 之前就被處理，確保敏感資料不進入傳輸和儲存層。可先對照 &lt;a href="https://tarrragon.github.io/blog/monitoring/knowledge-cards/funnel-analysis/" data-link-title="Funnel Analysis" data-link-desc="說明追蹤使用者在多步驟流程中每一步的轉換率和流失率的分析方法">funnel analysis&lt;/a>（去識別化是行為分析的入場條件）。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Redaction 位在 SDK 端的事件產生和 collector 端的事件接收之間。它是監控資料安全的第一道防線 — 在資料離開使用者裝置之前處理，比 collector 端的 access control 更早介入。Redaction 和 transport 加密（HTTPS）互補：redaction 保護欄位內容，transport 加密保護傳輸過程。&lt;/p>
&lt;h2 id="可觀察訊號與例子">可觀察訊號與例子&lt;/h2>
&lt;p>系統需要 redaction 的訊號是監控事件的 data 欄位可能包含使用者輸入。CLI 輸入可能含密碼（&lt;code>mysql -p'secret'&lt;/code>）、API key（&lt;code>Authorization: Bearer sk-...&lt;/code>）、連線字串（含帳密的 URL）。IME 個人化學習也是洩漏面 — 輸入框的內容被 IME 學習後跨 app 可見。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>Redaction 要定義預設規則（哪些欄位名稱自動 redact）、自訂 pattern（正則表達式比對敏感值）、執行時機（event 進入 buffer 前還是 flush 時）、以及 redaction 失敗的處理（丟棄整筆事件 vs 只移除敏感欄位）。&lt;/p></description><content:encoded><![CDATA[<p>Redaction 的核心概念是「在事件資料離開 client 之前，把敏感欄位的值替換成遮罩或移除」。密碼、API key、個人識別資訊在送到 collector 之前就被處理，確保敏感資料不進入傳輸和儲存層。可先對照 <a href="/blog/monitoring/knowledge-cards/funnel-analysis/" data-link-title="Funnel Analysis" data-link-desc="說明追蹤使用者在多步驟流程中每一步的轉換率和流失率的分析方法">funnel analysis</a>（去識別化是行為分析的入場條件）。</p>
<h2 id="概念位置">概念位置</h2>
<p>Redaction 位在 SDK 端的事件產生和 collector 端的事件接收之間。它是監控資料安全的第一道防線 — 在資料離開使用者裝置之前處理，比 collector 端的 access control 更早介入。Redaction 和 transport 加密（HTTPS）互補：redaction 保護欄位內容，transport 加密保護傳輸過程。</p>
<h2 id="可觀察訊號與例子">可觀察訊號與例子</h2>
<p>系統需要 redaction 的訊號是監控事件的 data 欄位可能包含使用者輸入。CLI 輸入可能含密碼（<code>mysql -p'secret'</code>）、API key（<code>Authorization: Bearer sk-...</code>）、連線字串（含帳密的 URL）。IME 個人化學習也是洩漏面 — 輸入框的內容被 IME 學習後跨 app 可見。</p>
<h2 id="設計責任">設計責任</h2>
<p>Redaction 要定義預設規則（哪些欄位名稱自動 redact）、自訂 pattern（正則表達式比對敏感值）、執行時機（event 進入 buffer 前還是 flush 時）、以及 redaction 失敗的處理（丟棄整筆事件 vs 只移除敏感欄位）。</p>
]]></content:encoded></item><item><title>SDK redaction helper</title><link>https://tarrragon.github.io/blog/monitoring/03-sdk-design/redaction-helper/</link><pubDate>Fri, 19 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/monitoring/03-sdk-design/redaction-helper/</guid><description>&lt;p>SDK &lt;a href="https://tarrragon.github.io/blog/monitoring/knowledge-cards/redaction/" data-link-title="Redaction" data-link-desc="說明在事件資料離開 client 之前把敏感欄位的值替換成遮罩或移除的機制">redaction&lt;/a> helper 在事件離開 SDK（進入 HTTP POST payload）前掃描事件內容，把匹配敏感資訊 pattern 的欄位值替換為 &lt;code>[REDACTED]&lt;/code>。Redaction 在 SDK 端執行，確保敏感資訊不會經過網路傳輸到 collector — 即使 transport 層被攔截，攻擊者看到的也是脫敏後的資料。&lt;/p>
&lt;h2 id="預設-redaction-rule">預設 redaction rule&lt;/h2>
&lt;p>SDK 內建一組預設 rule，處理常見的敏感資訊 pattern：&lt;/p>
&lt;h3 id="密碼欄位">密碼欄位&lt;/h3>
&lt;p>匹配 data 物件中 key 包含 &lt;code>password&lt;/code>、&lt;code>passwd&lt;/code>、&lt;code>secret&lt;/code>、&lt;code>token&lt;/code>、&lt;code>api_key&lt;/code>、&lt;code>apiKey&lt;/code>、&lt;code>authorization&lt;/code> 的欄位。匹配方式是 key 名稱的子字串比對（case-insensitive）。&lt;/p>
&lt;h3 id="url-中的認證資訊">URL 中的認證資訊&lt;/h3>
&lt;p>匹配 &lt;code>https://user:password@host&lt;/code> 格式的 URL，把 &lt;code>user:password&lt;/code> 部分替換為 &lt;code>[REDACTED]&lt;/code>。&lt;/p>
&lt;h3 id="stack-trace-中的檔案路徑">Stack trace 中的檔案路徑&lt;/h3>
&lt;p>匹配 stack trace 字串中的使用者目錄路徑（&lt;code>/Users/username/&lt;/code>、&lt;code>/home/username/&lt;/code>、&lt;code>C:\Users\username\&lt;/code>），替換為 &lt;code>[USER_HOME]/&lt;/code>。避免使用者名稱從 stack trace 洩漏。&lt;/p>
&lt;h2 id="自訂-redaction-rule">自訂 redaction rule&lt;/h2>
&lt;p>業務特定的敏感資訊（信用卡號、身分證字號、醫療資料）不在預設 rule 的範圍內。SDK 提供 API 讓開發者在 init 時註冊自訂 rule。&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">Monitor.init({
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl"> redactionRules: [
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl"> { pattern: /\b\d{4}[-\s]?\d{4}[-\s]?\d{4}[-\s]?\d{4}\b/, replace: &amp;#39;[CARD]&amp;#39; },
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">4&lt;/span>&lt;span class="cl"> { keyPattern: /^ssn$/i, replace: &amp;#39;[REDACTED]&amp;#39; },
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">5&lt;/span>&lt;span class="cl"> ],
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">6&lt;/span>&lt;span class="cl">})&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>自訂 rule 和預設 rule 一起執行。如果同一個值被多個 rule 匹配，第一個匹配的 rule 生效（rule 的執行順序：預設 rule 先，自訂 rule 後）。&lt;/p>
&lt;h2 id="redaction-的執行時機">Redaction 的執行時機&lt;/h2>
&lt;p>Redaction 在事件進入 flush payload 的那一刻執行 — buffer 中的事件保持原始內容，flush 時複製一份並在複製上執行 redaction。&lt;/p>
&lt;p>在 buffer 中保持原始內容的理由是 debug：開發者在本地 console 看到的 log 應該包含完整資訊（開發環境不需要脫敏），只有離開 SDK 時才脫敏。SDK 可以提供 &lt;code>debugMode&lt;/code> flag — debugMode 開啟時 console log 印出原始內容，HTTP POST 仍送出脫敏後的內容。&lt;/p>
&lt;h2 id="redaction-和模組七的關係">Redaction 和模組七的關係&lt;/h2>
&lt;p>SDK redaction helper 是&lt;a href="https://tarrragon.github.io/blog/monitoring/07-security-privacy/" data-link-title="模組七：資安與隱私" data-link-desc="SDK redaction / transport 加密 / collector access control / 去識別化 — 蒐集的資料本身就是風險資產">模組七 資安與隱私&lt;/a>中 redaction 策略的實作層。模組七定義「什麼資訊需要被保護」（策略），本章定義「SDK 如何在程式碼中實現這個保護」（實作）。&lt;/p>
&lt;p>兩者的分工：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>層級&lt;/th>
 &lt;th>職責&lt;/th>
 &lt;th>定義在&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>策略層&lt;/td>
 &lt;td>哪些欄位需要 redaction、哪些 pattern 敏感&lt;/td>
 &lt;td>模組七&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>實作層&lt;/td>
 &lt;td>預設 rule、自訂 rule API、執行時機&lt;/td>
 &lt;td>本章&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>驗證層&lt;/td>
 &lt;td>確認脫敏後的事件不包含敏感資訊&lt;/td>
 &lt;td>collector 端&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>Collector 端可以做第二道檢查（re-scan 收到的事件是否仍包含敏感 pattern），作為 SDK 端 redaction 的備援。但主要的脫敏責任在 SDK 端 — 資料離開 SDK 後經過網路，已經暴露在傳輸風險中。&lt;/p>
&lt;h2 id="下一步路由">下一步路由&lt;/h2>
&lt;ul>
&lt;li>SDK 公開 API → &lt;a href="https://tarrragon.github.io/blog/monitoring/03-sdk-design/public-api/" data-link-title="SDK 公開 API 設計" data-link-desc="init / event / error / metric / flush / close 六個方法構成 SDK 的完整生命週期 — 跨平台共用相同 API 介面">SDK 公開 API 設計&lt;/a>&lt;/li>
&lt;li>資安與隱私的完整策略 → &lt;a href="https://tarrragon.github.io/blog/monitoring/07-security-privacy/" data-link-title="模組七：資安與隱私" data-link-desc="SDK redaction / transport 加密 / collector access control / 去識別化 — 蒐集的資料本身就是風險資產">模組七 資安與隱私&lt;/a>&lt;/li>
&lt;li>自動攔截的 error 也需要 redaction → &lt;a href="https://tarrragon.github.io/blog/monitoring/03-sdk-design/auto-intercept/" data-link-title="自動攔截機制" data-link-desc="JS window.onerror / Flutter FlutterError.onError / Python sys.excepthook — 各平台攔截未捕獲例外的機制和限制">自動攔截機制&lt;/a>&lt;/li>
&lt;/ul></description><content:encoded><![CDATA[<p>SDK <a href="/blog/monitoring/knowledge-cards/redaction/" data-link-title="Redaction" data-link-desc="說明在事件資料離開 client 之前把敏感欄位的值替換成遮罩或移除的機制">redaction</a> helper 在事件離開 SDK（進入 HTTP POST payload）前掃描事件內容，把匹配敏感資訊 pattern 的欄位值替換為 <code>[REDACTED]</code>。Redaction 在 SDK 端執行，確保敏感資訊不會經過網路傳輸到 collector — 即使 transport 層被攔截，攻擊者看到的也是脫敏後的資料。</p>
<h2 id="預設-redaction-rule">預設 redaction rule</h2>
<p>SDK 內建一組預設 rule，處理常見的敏感資訊 pattern：</p>
<h3 id="密碼欄位">密碼欄位</h3>
<p>匹配 data 物件中 key 包含 <code>password</code>、<code>passwd</code>、<code>secret</code>、<code>token</code>、<code>api_key</code>、<code>apiKey</code>、<code>authorization</code> 的欄位。匹配方式是 key 名稱的子字串比對（case-insensitive）。</p>
<h3 id="url-中的認證資訊">URL 中的認證資訊</h3>
<p>匹配 <code>https://user:password@host</code> 格式的 URL，把 <code>user:password</code> 部分替換為 <code>[REDACTED]</code>。</p>
<h3 id="stack-trace-中的檔案路徑">Stack trace 中的檔案路徑</h3>
<p>匹配 stack trace 字串中的使用者目錄路徑（<code>/Users/username/</code>、<code>/home/username/</code>、<code>C:\Users\username\</code>），替換為 <code>[USER_HOME]/</code>。避免使用者名稱從 stack trace 洩漏。</p>
<h2 id="自訂-redaction-rule">自訂 redaction rule</h2>
<p>業務特定的敏感資訊（信用卡號、身分證字號、醫療資料）不在預設 rule 的範圍內。SDK 提供 API 讓開發者在 init 時註冊自訂 rule。</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">Monitor.init({
</span></span><span class="line"><span class="ln">2</span><span class="cl">  redactionRules: [
</span></span><span class="line"><span class="ln">3</span><span class="cl">    { pattern: /\b\d{4}[-\s]?\d{4}[-\s]?\d{4}[-\s]?\d{4}\b/, replace: &#39;[CARD]&#39; },
</span></span><span class="line"><span class="ln">4</span><span class="cl">    { keyPattern: /^ssn$/i, replace: &#39;[REDACTED]&#39; },
</span></span><span class="line"><span class="ln">5</span><span class="cl">  ],
</span></span><span class="line"><span class="ln">6</span><span class="cl">})</span></span></code></pre></div><p>自訂 rule 和預設 rule 一起執行。如果同一個值被多個 rule 匹配，第一個匹配的 rule 生效（rule 的執行順序：預設 rule 先，自訂 rule 後）。</p>
<h2 id="redaction-的執行時機">Redaction 的執行時機</h2>
<p>Redaction 在事件進入 flush payload 的那一刻執行 — buffer 中的事件保持原始內容，flush 時複製一份並在複製上執行 redaction。</p>
<p>在 buffer 中保持原始內容的理由是 debug：開發者在本地 console 看到的 log 應該包含完整資訊（開發環境不需要脫敏），只有離開 SDK 時才脫敏。SDK 可以提供 <code>debugMode</code> flag — debugMode 開啟時 console log 印出原始內容，HTTP POST 仍送出脫敏後的內容。</p>
<h2 id="redaction-和模組七的關係">Redaction 和模組七的關係</h2>
<p>SDK redaction helper 是<a href="/blog/monitoring/07-security-privacy/" data-link-title="模組七：資安與隱私" data-link-desc="SDK redaction / transport 加密 / collector access control / 去識別化 — 蒐集的資料本身就是風險資產">模組七 資安與隱私</a>中 redaction 策略的實作層。模組七定義「什麼資訊需要被保護」（策略），本章定義「SDK 如何在程式碼中實現這個保護」（實作）。</p>
<p>兩者的分工：</p>
<table>
  <thead>
      <tr>
          <th>層級</th>
          <th>職責</th>
          <th>定義在</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>策略層</td>
          <td>哪些欄位需要 redaction、哪些 pattern 敏感</td>
          <td>模組七</td>
      </tr>
      <tr>
          <td>實作層</td>
          <td>預設 rule、自訂 rule API、執行時機</td>
          <td>本章</td>
      </tr>
      <tr>
          <td>驗證層</td>
          <td>確認脫敏後的事件不包含敏感資訊</td>
          <td>collector 端</td>
      </tr>
  </tbody>
</table>
<p>Collector 端可以做第二道檢查（re-scan 收到的事件是否仍包含敏感 pattern），作為 SDK 端 redaction 的備援。但主要的脫敏責任在 SDK 端 — 資料離開 SDK 後經過網路，已經暴露在傳輸風險中。</p>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>SDK 公開 API → <a href="/blog/monitoring/03-sdk-design/public-api/" data-link-title="SDK 公開 API 設計" data-link-desc="init / event / error / metric / flush / close 六個方法構成 SDK 的完整生命週期 — 跨平台共用相同 API 介面">SDK 公開 API 設計</a></li>
<li>資安與隱私的完整策略 → <a href="/blog/monitoring/07-security-privacy/" data-link-title="模組七：資安與隱私" data-link-desc="SDK redaction / transport 加密 / collector access control / 去識別化 — 蒐集的資料本身就是風險資產">模組七 資安與隱私</a></li>
<li>自動攔截的 error 也需要 redaction → <a href="/blog/monitoring/03-sdk-design/auto-intercept/" data-link-title="自動攔截機制" data-link-desc="JS window.onerror / Flutter FlutterError.onError / Python sys.excepthook — 各平台攔截未捕獲例外的機制和限制">自動攔截機制</a></li>
</ul>
]]></content:encoded></item><item><title>模組七：資安與隱私</title><link>https://tarrragon.github.io/blog/monitoring/07-security-privacy/</link><pubDate>Fri, 19 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/monitoring/07-security-privacy/</guid><description>&lt;p>回答「蒐集的資料本身就是風險資產，怎麼保護」。三層防護：SDK 端 redaction → transport 加密 → collector access control。&lt;/p>
&lt;h2 id="待寫章節">待寫章節&lt;/h2>
&lt;ul>
&lt;li>&lt;input checked="" disabled="" type="checkbox"> SDK redaction API 設計（預設 redaction rule + 自訂 pattern）&lt;/li>
&lt;li>&lt;input checked="" disabled="" type="checkbox"> Transport 安全（HTTPS / basic auth / 同區網也要加密的理由）&lt;/li>
&lt;li>&lt;input checked="" disabled="" type="checkbox"> Collector access control 實作（認證 / 授權 / access log）&lt;/li>
&lt;li>&lt;input checked="" disabled="" type="checkbox"> 去識別化策略（IP 截斷 / user agent 簡化 / stack trace 路徑清理 / session UUID）&lt;/li>
&lt;li>&lt;input checked="" disabled="" type="checkbox"> GDPR 最小化原則的工程落地&lt;/li>
&lt;li>&lt;input checked="" disabled="" type="checkbox"> 「監控資料洩漏」的 threat model&lt;/li>
&lt;li>&lt;input checked="" disabled="" type="checkbox"> Client-side SDK 認證的根本限制（credential 必然暴露、多層緩解策略）&lt;/li>
&lt;/ul>
&lt;h2 id="跨分類引用">跨分類引用&lt;/h2>
&lt;ul>
&lt;li>→ &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/" data-link-title="模組七：資安與資料保護" data-link-desc="以問題驅動方式擴充資安知識網：先定義服務環節問題，再以案例作為觸發式參考">backend 07 資安&lt;/a>：server-side 的 secret management 跟本模組的 redaction 互補&lt;/li>
&lt;li>← &lt;a href="https://tarrragon.github.io/blog/ux-design/03-input-mechanism/" data-link-title="模組三：輸入機制設計" data-link-desc="Keyboard type / submit model / IME policy / special keys — 輸入機制是設計產物，影響 UI layout 和 protocol">ux-design 模組三 輸入機制&lt;/a>：IME 個人化學習 = secret 洩漏&lt;/li>
&lt;li>← &lt;a href="https://tarrragon.github.io/blog/testing/02-client-observability/" data-link-title="模組二：客戶端可觀測性" data-link-desc="連線生命週期 log、protocol 訊息 log、使用者行為 log — log 設計是功能規格的一部分">testing 模組二 客戶端可觀測性&lt;/a>：log 內容可能含 secret，需要 redaction&lt;/li>
&lt;li>→ &lt;a href="https://tarrragon.github.io/blog/monitoring/08-business-analytics/" data-link-title="模組八：行為資料的商業利用" data-link-desc="Funnel / Cohort / Attribution / A/B test / 推薦系統 / RFM — 從 debug 工具到商業資產的翻轉">monitoring 模組八&lt;/a>：去識別化是商業利用的入場條件&lt;/li>
&lt;li>待建連結 → &lt;code>compliance/&lt;/code>（隱私法規教學分類）&lt;/li>
&lt;/ul></description><content:encoded><![CDATA[<p>回答「蒐集的資料本身就是風險資產，怎麼保護」。三層防護：SDK 端 redaction → transport 加密 → collector access control。</p>
<h2 id="待寫章節">待寫章節</h2>
<ul>
<li><input checked="" disabled="" type="checkbox"> SDK redaction API 設計（預設 redaction rule + 自訂 pattern）</li>
<li><input checked="" disabled="" type="checkbox"> Transport 安全（HTTPS / basic auth / 同區網也要加密的理由）</li>
<li><input checked="" disabled="" type="checkbox"> Collector access control 實作（認證 / 授權 / access log）</li>
<li><input checked="" disabled="" type="checkbox"> 去識別化策略（IP 截斷 / user agent 簡化 / stack trace 路徑清理 / session UUID）</li>
<li><input checked="" disabled="" type="checkbox"> GDPR 最小化原則的工程落地</li>
<li><input checked="" disabled="" type="checkbox"> 「監控資料洩漏」的 threat model</li>
<li><input checked="" disabled="" type="checkbox"> Client-side SDK 認證的根本限制（credential 必然暴露、多層緩解策略）</li>
</ul>
<h2 id="跨分類引用">跨分類引用</h2>
<ul>
<li>→ <a href="/blog/backend/07-security-data-protection/" data-link-title="模組七：資安與資料保護" data-link-desc="以問題驅動方式擴充資安知識網：先定義服務環節問題，再以案例作為觸發式參考">backend 07 資安</a>：server-side 的 secret management 跟本模組的 redaction 互補</li>
<li>← <a href="/blog/ux-design/03-input-mechanism/" data-link-title="模組三：輸入機制設計" data-link-desc="Keyboard type / submit model / IME policy / special keys — 輸入機制是設計產物，影響 UI layout 和 protocol">ux-design 模組三 輸入機制</a>：IME 個人化學習 = secret 洩漏</li>
<li>← <a href="/blog/testing/02-client-observability/" data-link-title="模組二：客戶端可觀測性" data-link-desc="連線生命週期 log、protocol 訊息 log、使用者行為 log — log 設計是功能規格的一部分">testing 模組二 客戶端可觀測性</a>：log 內容可能含 secret，需要 redaction</li>
<li>→ <a href="/blog/monitoring/08-business-analytics/" data-link-title="模組八：行為資料的商業利用" data-link-desc="Funnel / Cohort / Attribution / A/B test / 推薦系統 / RFM — 從 debug 工具到商業資產的翻轉">monitoring 模組八</a>：去識別化是商業利用的入場條件</li>
<li>待建連結 → <code>compliance/</code>（隱私法規教學分類）</li>
</ul>
]]></content:encoded></item></channel></rss>