一段文字裡混著好幾種號碼,勾選以後各檔分別怎麼變
起因很具體:貼進去的一段文字裡 11、18、16 碼元三種長度的串都有,五個勾選框全亮著,輸出裡每檔各吃掉多少格。跑法:模板 7386 位元組 / 152 行、腳本區塊 2853 碼元原樣執行,五條正則與 repeat、doMask 不改寫、不修 bug,DOM 只給按 id 的樁,純 Node。數字全是字串層實測,長度按 UTF-16 碼元;樣本串要麼是順序位與連續重複位拼出的虛構輸入,要麼是模板自帶的預設樣本,與任何真實號碼無關,本篇一概把它們當作字串做算術。
被測的是隱私資訊遮掩:預設輸入是模板自帶的 4 行 / 108 碼元樣本,載入即跑一次 doMask(L150),沒有按鈕觸發。
星號枚數是寫死的常數,跟輸入長度無關
五條替換式裡 repeat 的上界全是字面值,呼叫點 6 處、常數依次 4、3、11、4、4、4(L98 / L106 / L114 / L124),IP 檔(L132)不進 repeat 而是直接拼 2 枚。
| 檔 | 星號枚數 | 替換式形態 | 外露比例 |
|---|---|---|---|
| 手機 | 4 | 頭 3 + 4 枚 + 尾 4 | 63.6% |
| 郵箱 | 3 | 首字符 + 3 枚 | 25.0% |
| 證件 | 11 | 頭 3 + 11 枚 + 尾 4 | 38.9% |
| 卡號 | 12 | 三段各 4 枚加空格 | 21.1% |
| IP | 2 | 留前兩段重拼 | 54.5% |
同一檔內輸入變長變短都不改這個數:卡檔取 16、17、18、19 碼元四檔,星號恆 12、輸出碼元恆 19、外露數字恆 4;手機檔從 11 碼元加長到 30 碼元,星號恆 4、命中恆 1 處;證件檔只有 18 碼元那檔命中,星號恆 11。「比模板長」不是降級而是不接手——純數字串 20..40 碼元在五檔全勾下 0 命中、外露 100.0%。
圖 1:五檔常數的恆定讀數。
輸入比模板短,既不落進掩碼也不落進重疊
重疊那一檔:head 取 3、tail 取 4,命中串短於 3+4 = 7 碼元時兩段共用同一格、明文重複外露(假想表 n=6 得 123****3456,index 2 出現兩次)。但三條用 slice 的正則拿不到這麼短的命中串:手機的定長帳是 1 枚字面加 1 枚字符類加 9 枚 = 11,證件 17+1 = 18,卡取 16..19,最小命中長度 11、18、16 分別比門檻 7 多 4、11、9 碼元;400 條定向語料裸跑,「小於 7 的命中數」五檔全為 0。另兩檔不切片,重疊外露在本頁不可達。
外露來自不錨定:18 碼元串被手機檔搶走
證件、卡、IP 三條帶 \b,手機與郵箱不帶,差別就在第 2 行:實測輸出 身份证号:110101199****11234,星號 4 枚、14 個數字碼元留著,佔 18 碼元的 77.8%——手機檔沒有邊界錨,先在證件串的 18 碼元內部命中一次,把證件檔要讀的輸入換掉;單獨關掉手機檔才得到 110***********1234、星號 11、外露 7。統計欄數字列 4、2、1、1 裡沒有「身份證」行:證件檔在自家首屏完全空轉,「關掉 idcard」與五檔全勾的輸出首個差異位置是 -1,32 種勾選組合只產出 24 種串,8 組冗餘全來自這一檔。
五條 replace 順序固定,殘段決定第二檔能不能接手
鏈路是手機 → 郵箱 → 證件 → 卡 → IP,前一條的輸出就是後一條的輸入。手機檔切完後尾 4 碼元與其後數字相連,卡檔接手看「4 加殘留」是否落在 16..19。輸入 24 碼元的 138123456781234567890123 → 手機先切、卡檔在殘段命中長度 17 → 星號 16;加長到 27 碼元時殘段 20 大於 19,卡檔 0 命中。郵箱檔同理:local 混進一枚 11 碼元數字段(整行 31 碼元)→ 手機先切、郵箱再接手 → 星號 7,比只勾郵箱檔差 15 碼元。
圖 2:串接順序與殘段接手視窗。
遮掩字符框的三處口徑
框上寫著 value="*" 與 maxlength="1"(L35),取值句子(L84)的回落只對空串生效。把框清空,13812345678 仍出 138****5678、4 枚星號,與預設逐字相同;打一個空格則空格 truthy、不回落,11 碼元裡 4 碼元是空格、星號 0。樁裡強寫兩字符,repeat 產出 8 碼元、手機檔輸出 15 碼元。連打兩個字符會不會被截成一格、預設按鈕寫入是否同受約束,屬瀏覽器控制元件層,本批純 Node 沒起 headless Chrome,標未實測。
統計欄數的是命中處數
五個計數器只在各 replace 回調裡自增,總數取五數之和(L139),命中 0 的檔整行不渲染。1 行 3 個手機號是 3 處 / 12 枚星號、仍 1 行;100 行重複樣本給 200 處而行數只有 100;空輸入走提前返回,統計欄寫成 0 碼元而不是「0 處」。把結果貼回去再遮一輪:第 1 輪從 108 變 104 碼元,第 2 輪輸出與輸入逐字相等、星號仍 23。
IP 檔預設沒勾,文案卻把它和前四檔並列
逐字讀屬性:前四個 input 帶 checked(L18 / L21 / L24 / L27),mask-ip(L30)沒有——預設首屏第 4 行與輸入逐字相等、星號 0;勾上以後 13 碼元變 11 碼元、2 枚星號,星號帳從 23 漲到 25。頁面配置 16 項裡可判 15 項:[一致] 8、[部分一致] 5、[衝突] 2,一處在「中間 11 位遮掩」那句整頁斷言(首屏證件檔命中 0 次,差 7 枚星號),一處在把預設未勾的 IP 寫成自動識別。
命中這件事,兩個頁各有一把尺
本頁只替換不挑選,判據是五條正則的命中處數;按類型挑欄位是文字資訊擷取那一頁的活,兩頁口徑不是同一把尺。內建類型在擷取側撞上限那件事,站內舊文量過,不複述它的數字。
常見問題
Q:星號枚數會隨輸入長度變嗎?
不會——卡檔輸入從 16 到 19 碼元,星號恆 12、輸出碼元恆 19;手機檔從 11 到 30 碼元,星號恆 4。
Q:短於 7 碼元的串會把明文重複露出來嗎?
算術上會,n=6 時 head 與 tail 共享 index 2 那一枚;但三條切片的正則最小命中 11、18、16 夠不到門檻,實測重疊在本頁不可達。
Q:勾了證件檔,統計裡為什麼沒有身份證那一行?
18 碼元串被排在前面的手機檔改寫,證件檔拿到已含遮掩字符的中間串,命中 0 次的檔整行不渲染。