字段命名不规范会导致自动填充错配到错误字段
别名: autocomplete 属性 · 字段错配 · autofill heuristics · name id label
概念解释
浏览器靠字段的 name、id、可见标签和 autocomplete 提示来猜这是姓名、地址还是信用卡。命名不规范指这些线索互相打架或使用了内部代号(input1、txt_3、把邮箱框叫 username),于是家庭住址被填进「公司」、卡号被填进「会员号」。这是映射错误,不是应用档案过期,也不是两套来源抢着写。隐藏字段被填、人能不能改掉填错的值,是后面两步。
机制
自动填充是启发式:先看标准 autocomplete 令牌(given-name、address-line1、cc-number),再看 name/id 里的英文词,再看邻近标签文本。内部代号不含这些词,浏览器就退回到「第几个文本框像地址」。一张表上两个「姓名」——持卡人与收货人——若都叫 name,常被写成同一串。第二层是框架生成的 name:服务端列表渲染出 items[2].street,启发式读到 street 就把地址填进第三行商品备注。错配一旦发生,校验可能仍通过(都是合法地址格式),错误在履约时才爆。人很难发现,因为框里「看起来像地址」。autocomplete="off" 在登录和地址上常被浏览器忽略,不能当命名的替代;正确令牌比关填充更可靠。
怎么研究
在干净的浏览器档案里存一套地址和一张卡,打开命名各异的表,记录每个字段实际被填入的值类型。
自变量:autocomplete 令牌是否标准、name/id 是否语义化、同一表上是否有两组同义字段、标签文案与令牌是否一致。
因变量:错配次数(地址进电话、卡号进会员)、人是否在提交前发现、履约错误。
不要用开发者自己的档案——他们的字段已经被浏览器「学习」过。要用新档案或隐私窗口加一套新地址。应用预填要关掉,否则分不清是谁写入的。
边界
自定义控件(画布、可编辑 div)没有 autocomplete 钩子,浏览器不会填,错配不会发生,缺的是填充本身。用非拉丁标签、没有英文 name 的本地化表,启发式更弱,更依赖明确令牌。密码管理器对用户名/密码的启发式比地址更保守,但把验证码框命名成 password 仍会触发填密码。服务端只收代号、前端用令牌,两套 name 要同时语义化,不能只美化标签。
怎么落地
- 给每个可填充字段写标准
autocomplete令牌,令牌、可见标签、name三者同指一件事。 - 同一张表上的两组地址或两个姓名用不同令牌区分(
shippingvsbilling前缀),禁止都叫name。 - 不要用
input1、框架下标或把邮箱叫username;off不能代替正确令牌。 - 验证:新浏览器档案保存一套地址和卡,打开表单,逐字段看填入的是不是该字段的类型。把收货姓名和持卡人姓名都设为
name,作为必现的错配对照。关掉应用预填再测一次,确认错配来自浏览器而不是档案脚本。