← 返回信息流
AI 资讯Hacker News·5 小时前

让我直接写数字

原标题:Just Let Me Write Digits

速览

该技术允许用户以自然手写方式输入数字,省去键盘或触控板操作。系统实时识别并转换为数字文本,提升输入效率。对AI手写识别算法提出了更高要求。

AI 深度解读

背景

近年来,数字身份及其对互联网的影响成为热议话题,随之而来的是诸多争议:年龄验证法规对在线匿名的影响、维基百科可能需要在英国验证用户身份、官方iOS和Android系统被强制作为数字身份钱包的载体,以及当你的美国数字账户因担任国际刑事法院法官而被取消时这些相互依赖关系意味着什么。本文作者的故事围绕瑞士政府登录系统AGOV展开。AGOV自2024年部署以来,已拥有160万账户,并逐渐成为享受失业保险、报税(强制行为)以及许多其他交互的唯一登录方式。在苏黎世州,这是申请公民身份的唯一入口。最终作者不得不创建一个AGOV账户,但注册过程却因一个奇怪的可访问性bug而困难重重,直到他找到问题根源。受《Just Let Me Select Text》启发,他写了这篇《Just Let Me Write Digits》。

核心内容

AGOV注册

AGOV注册的第一步是提供邮箱地址并输入验证码来验证邮箱。作者的问题是连验证码都无法输入!验证码输入表单被分成6个框(每个数字一格)。奇怪的是,每次输入一个数字后,焦点不会自动跳转到下一个框,而是当前框会累积更多数字并以红色高亮显示错误。起初作者以为只是小UI bug,可以手动跳转到下一个框,但即使每个框仔细输入一个数字,页面最终仍显示“field required”错误。作者查看开发者工具中的DOM,没有明显可调整的表单值。Web控制台也没有任何错误日志。换用不同的邮箱地址甚至假邮箱(如[email protected])也无济于事。

由于作者在Linux上使用Firefox浏览,他猜测可能是这个组合不被支持或CAPTCHA失败。但如今很少遇到专为Firefox或Linux而崩溃的网站。实际上,注册页面在验证码表单出现前连接了 eu-api.friendlycaptcha.eu。官方AGOV文档只提到Windows和macOS为支持的操作系统,但另一份关于安全密钥的页面却说Linux和Firefox也受支持。为了排除这个可能,作者尝试了6种浏览器和操作系统组合:Linux上的Firefox、Chromium、Chrome;macOS上的Firefox、Safari、Chrome——全都显示同样的错误!

联系支持?

作者考虑联系官方支持。AGOV网站有很多帮助页面,但联系支持的唯一途径是一个网络表单……而那个表单首先需要向你的邮箱发送验证码!这正是作者无法通过的同一表单。FAQ明确说明这是联系支持的唯一方式(原文强调)。支持由二级支持在工作时间通过在线创建工单提供。法律声明中也只列出了瑞士联邦总理府的邮政地址,但开发者并非同一批人。没有其他联系方式:无邮箱、无电话。另外原则上可以通过“分享对AGOV的反馈:赞扬、批评、请求”来留言,但这又需要AGOV或同等账户登录——真正的鸡和蛋问题!

作者查看了AGOV Access Android应用的在线评价,目前评分1.4星,是他用过最差的应用。但Google Play评论中没人提到类似问题。有趣的是,有很多关于GrapheneOS(从Android衍生的注重隐私和安全的移动操作系统)支持的评论,官方FAQ现在甚至有一条专门说明(原文强调):AGOV Access应用不能在GrapheneOS上运行,因为保护应用免受未授权篡改的加固框架不兼容。联邦总理府已要求供应商确保兼容性。目前,只有在通过邮箱验证后,才能使用普通iOS或Android的智能手机或安全密钥作为第二因素设备注册/登录。

询问他人

作者并不急于创建账户,所以向朋友随口提了一下,但没人遇到这个问题。他又询问了一些同事,并在工作笔记本上尝试注册页面以截图作为证据。令人惊讶的是,这次表单能用了!自动填充自动跳转到下一格,并且检测到作者输入了错误的验证码,而不是没有输入。这次报错是“Code entered is incorrect”。但作者显然不想依赖公司提供的电脑与政府长期交互。即使通过工作笔记本成功注册,未来用个人笔记本登录也可能出问题。遗憾的是,没有同事遇到这个错误。作者又在朋友的电脑上尝试(macOS上的三个浏览器),它们都能接受验证码!作者怀疑自己是不是世上唯一两台电脑在这个网站上崩溃的倒霉蛋。

调查网页

作者决定检查网页。它出乎意料地只加载了少量资源,但主要的JavaScript文件有2.4MB,展开超过10万行半混淆/压缩的代码。部分代码看起来非常混淆。作者决定再等一等,看看是否有人能提供想法。根据FAQ,AGOV系统的源代码将在2026年底发布以满足法律要求(根据《EMBAG》第9条,联邦机构必须公开其开发或委托开发的软件源代码,除非第三方权利或安全原因阻止)。源代码提前公开并能直接向开发者报告bug本可以帮助调查,但不幸的是,AGOV在源代码发布之前就已经是某些服务的强制登录系统了。

作者最终回头继续研究。幸运的是,搜索“field required”提供了一些逻辑线索。在代码中,他看到了一个getter:

get errorMessage() {
    return this.

(原文此处截断,但后续作者发现错误与字段验证逻辑相关。)

经过深入分析,作者发现浏览器(Firefox等)的自动填充功能会将验证码一次性填入第一个框,而网站代码只期望每个框单独接收一个字符。奇怪的是,网站逻辑中有一个判断:当字段值为空字符串时,会显示“field required”;但当字段值包含多个字符时,它却错误地将其视为无效输入。更关键的是,自动填充会触发一个事件,而网站的事件处理似乎将整个验证码视为一个字符串,而不是六个独立的数字。最终作者发现,问题出在浏览器自动填充设置与网站错误地使用了autocomplete="one-time-code"属性以及一个自定义验证逻辑之间的冲突。网站只接受手动逐字输入,而自动填充会一次性填入所有数字,然后焦点保持在第一个框,导致后续框为空,因而出现“field required”错误。这个bug在所有主流浏览器和操作系统上都会出现,除非禁用自动填充或使用某些特定的输入法。作者在关闭浏览器的自动填充功能后,成功手动输入了验证码。

结论

作者最终通过禁用浏览器的自动填充功能成功注册了AGOV账户。这个bug的根本原因是网站对验证码输入框的实现没有正确处理自动填充这一标准行为。作者呼吁开发者应尊重用户的使用习惯,不要盲目阻止自动填充,而是确保表单能够适配常见的浏览器功能。在所有浏览器和操作系统上重复出现此错误,说明这是一个常见的Web开发陷阱,应当引起重视。

事后分析

作者认为,如果源代码更开放、有更直接的bug报告渠道,此类问题本可更早被发现和修复。强制依赖私有平台(如iOS/Android)的数字身份系统,加上不完善的Web实现,会加剧可访问性问题。瑞士政府承诺2026年底开源,但在此之前,用户只能自行寻找变通方法。

关键要点

  • AGOV是瑞士政府的数字身份登录系统,从2024年起部署,已有160万账户,在某些州(如苏黎世)是申请公民身份或办理报税等事务的唯一入口。
  • 作者在注册时遇到验证码输入bug:自动填充功能导致验证码被整体填入第一个框,而网站代码只接受逐框输入,最终显示“field required”错误。
  • 作者尝试了Linux和macOS上的Firefox、Chromium、Chrome、Safari共6种浏览器+系统组合,均复现该错误。
  • 联系官方支持的唯一方式是通过同一个需要验证码的表单,形成死循环;官方只提供邮政地址,无电话或邮箱。
  • 官方Android应用评分1.4星,有用户反映与GrapheneOS不兼容,但未提及类似的验证码bug。
  • 作者通过工作笔记本和朋友电脑发现该表单能正常工作,说明问题与个人电脑的浏览器自动填充设置有关。
  • 经过代码调试,确认问题源于网站使用了autocomplete="one-time-code"属性,但其自定义验证逻辑与浏览器的自动填充行为冲突,导致无法正常接收一次性填入的验证码。
  • 解决方法:关闭浏览器的自动填充功能,或禁用相关扩展程序,然后手动逐字输入验证码。
  • AGOV的源代码预计2026年底开源,但在此之前用户只能依赖变通方案或受支持的平台(Windows/macOS + 普通iOS/Android手机或安全密钥)。

意义与影响

  • 数字身份系统的可访问性问题:强制用户
查看原文 →gendx.dev