题目
你在做 NFT 详情页,需要展示链上返回的名字与描述。测试同学提交了一个问题:把某个特殊构造的合约名字渲染到页面上,会触发脚本执行。
请说明这类数据在渲染前需要经过哪些处理,以及哪些链上数据属于不可信输入。
考察目标
- 能否识别链上数据的不可信性质。
- 是否知道字符串与字节数据在解码后的处理差别。
- 能否给出可执行的渲染防护清单。
考察链上字符串与字节数据的处理,以及把合约数据当输入渲染时的注入风险。
你在做 NFT 详情页,需要展示链上返回的名字与描述。测试同学提交了一个问题:把某个特殊构造的合约名字渲染到页面上,会触发脚本执行。
请说明这类数据在渲染前需要经过哪些处理,以及哪些链上数据属于不可信输入。
ABI 的 string 与 bytes 都可能包含不可信内容。React 普通文本插值会转义字符,可以作为文本展示;把它交给 dangerouslySetInnerHTML、富文本解析器或 URL 属性时需按对应上下文做安全处理。无法可靠解释的 bytes 可以按十六进制展示,不应把任意链上字符串当作可信 HTML。
string 按 UTF-8 字节序列编码,bytes 按原始字节序列编码,二者编码形式相近,差别在内容是否可解释为文本(依据:Solidity 文档 abi-spec §Formal Specification of the Encoding)name、symbol、tokenURI 由实现自行返回,规范不校验内容真实性(依据:EIP-721 §Specification 的 Metadata 扩展)tokenURI 返回字符串,指向的内容按 Metadata JSON Schema 解释,其中的 image 是 URI 字段(依据:EIP-721 §Specification 的 ERC-721 Metadata JSON Schema)name、symbol、decimals 标为 OPTIONAL,规范说明接口与其他合约不应假定这些值存在(依据:EIP-20 §Specification 的 name、symbol、decimals)name、decimals 都存在,调用失败时页面变成空白(依据:EIP-20 §Specification 的 OPTIONAL 说明)发现这道题有问题? 反馈此题