JSON 设备编号超过安全整数后,怎样避免浏览器悄悄改号

2026-10-24

设备编号一旦超过JavaScript能精确表示的安全整数范围,把它作为JSON数字交给普通Number解析就可能改号。标识符宜约定为十进制字符串,并端到端保持字符串。不能等JSON.parse之后再转字符串补救,因为精度可能已经在解析时丢失;也不能只在界面格式化时隐藏小数来掩盖问题。

环境和证据范围

RFC8259允许实现限制数值范围和精度,并指出二进制64位浮点实现中可精确互操作的整数范围。本文不声称JSON语法只允许53位整数;Python能精确读取这些整数,也不代表浏览器Number能保持。附件确实调用本机Node解析合成样本,运行时还需Node.js命令可用;未测真实浏览器和设备。

核对顺序

  1. 先确定字段是标识符还是可计算量。设备ID通常不应参加加减,前导零也可能有意义,按字符串更适合;累计计数等数值字段则要另行约定精度和范围。

  2. 在生产端序列化前就把ID保留为字符串,并核对数据库驱动和网关是否先把它变成浮点数。响应从数字改成字符串是契约变更,应同步消费者,不能只改一个前端页面。

  3. 准备安全边界前后与明显超范围的整数,分别以数字和字符串传输。让目标运行时解析再序列化,逐字符比较原始ID,不能仅比较两个已经舍入过的Number是否相等。

  4. 为超范围数值定义拒绝或专门解析策略。普通JSON.stringify不能直接序列化BigInt;若使用专用库,应注明线格式和所有消费者支持情况,不能把BigInt后缀n直接塞进JSON。

可复算的输入与预期

数字9007199254740991可保持;数字9007199254740993在普通Node JSON.parse后再字符串化会变成9007199254740992;带引号的”9007199254740993”保持原样。下载脚本调用Node执行实际往返,与预置的三个结果比较,不用Python整数解析冒充JavaScript结果。

下载与现场记录

下载本题合成输入与预期JSON、离线只读核验脚本和现场空白记录CSV。放在同一目录,用 Python 3 运行 python verify.py,逐项计算或解析后与预期比较,失败会显示差异。

现场字段包括 runtime_version、field_name、raw_json、parsed_type、roundtrip_json、exact_id_equal。合成样例保持原样,实测另存并填写型号、版本、证据路径,未采集处留空。本地核验不代表真实设备、代理、浏览器或长期稳定性已测。

失败分支与移交

测试时只用9007199254740992可能误以为“超过安全范围仍准确”,因为个别更大整数仍恰好可表示。安全范围指所有整数都能保持的保证范围,不是每个超限数字必定损坏。若设备ID已改号,要回到最早原始字节追查,不能从舍入后的日志反推原号。

移交时列出字段类型、最大长度、是否保留前导零及拒绝规则,并提供真实运行时版本和原始JSON样本。设备列表、详情查询、事件推送和导出CSV应使用同一口径;只修一个入口,仍会在另一路消息里把同一台设备映射成两个编号。

基础背景可看HTTP / RESTful 设备控制接口科普。标识符类型之外,布尔与枚举也要严格核对,见接口把 false 写成字符串后,怎样验收布尔值与枚举类型。更多资料在设备协议库。

需要接入中控时,可对照SoftControl设备联动需求核实适配范围;独立校验方法是否纳入交付需逐项约定。

一级资料

核对日期:2026-10-24。规范定义与本文应用约定分开,示例门限及脚本不自动代表产品原生能力。

需要展厅软硬件方案或定制开发?

加微信,把这一页发到你手机上

扫码加站长企业微信,会自动把这一页的链接发给你。问软件授权、报价,或者现场遇到问题,也可以直接聊。

去留微信

留言讨论

评论发布后会被人工复核,违规内容将被删除。

    还没有人评论,来说说你的看法

    如果发表没有反应,可以前往联系我们告诉我们。

    这个页面有问题?

    提交时会附带当前页面地址和浏览器信息,帮助我们定位问题。不填联系方式即为匿名。