ERC-7087: 自动模式下 Web3 URL 的 MIME 类型
增加指示或确定自动模式下 Web3 URL 返回数据 MIME 类型的功能
Authors | Qi Zhou (@qizhou), Nicolas Deschildre (@nand2) |
---|---|
Created | 2023-05-28 |
Discussion Link | https://ethereum-magicians.org/t/erc-7087-mime-type-for-web3-url-in-auto-mode/14471 |
Requires | EIP-6860 |
摘要
本标准扩展了 ERC-6860 web3://
标准:在未为 web3://
设计的智能合约中(因此使用自动模式),返回数据的 MIME 类型要么是隐式的(未由智能合约声明),要么包含在返回的数据中(RFC 2397 data URLs)。本标准定义了额外的查询参数,以便在这些场景中获取 web3://
URL 时可以返回 MIME 类型。
动机
当向 Web 浏览器返回数据时,强烈建议使用 Content-Type
标头来指示数据的 MIME 类型,否则数据可能被 Web 浏览器错误地解释和显示。
web3://
协议有两种模式:手动和自动。
- 手动模式用于显式请求此模式的智能合约(通过接口),因此它们应使用 ERC-6860 中描述的机制来指示返回数据的 MIME 类型。
- 另一方面,自动模式用于专门请求该模式的智能合约,以及所有其他未发出任何信号的合约。虽然我们可以期望明确请求自动模式的智能合约来指示返回数据的 MIME 类型,但我们不能期望其他合约也这样做。
本标准旨在填补这一空白:通过引入额外的查询参数,它将允许 URL 指定返回数据的 MIME 类型。此外,当返回的数据是 RFC 2397 data URL 时,它将允许 URL 将返回的数据标记为 data URL,以便协议可以返回解码后的数据,并附带在 data URL 中声明的 MIME 类型。
规范
该标准引入了三个查询参数来确定 MIME 类型。
mime.content=<contentType>
,其中<contentType>
是 RFC 6838 中定义的 MIME 类型。如果<contentType>
不符合 MIME 类型的结构,则不会获取 URL,并且会向用户显示错误消息。URL 解码后,将<contentType>
设置为响应的Content-Type
标头的值;或mime.type=<fileType>
,其中<fileType>
是从中确定 MIME 类型的文件名扩展名。如果无法识别文件名扩展名,则不会获取 URL,并且会向用户显示错误消息。然后将 MIME 类型设置为响应的Content-Type
标头的值;或mime.dataurl
,表示将返回的字节解码为 RFC 2397 data URL。解码后,解码后的 body 将作为主要输出返回,并使用 data URL 中指定的 MIME 类型。如果数据无法解析为 data URL,则会返回错误。
如果存在多个查询参数,则将应用最后一个查询参数。如果未指定任何查询参数,则 Content-Type
由 ERC-6860 定义。如果指定了 returns
查询参数,则将忽略 mime.xxx
参数,并且 Content-Type
将由 ERC-6860 定义。
在 RFC 2234 ABNF 符号中,ERC-6860 语法是:
attribute = attrName "=" attrValue
attrName = "returns"
/ "returnTypes"
attrValue = [ "(" [ retTypes ] ")" ]
本标准将其演变为:
attribute = retAttr / mimeCAttr / mimeTAttr / mimeDAttr
retAttr = retAttrName "=" retAttrValue
retAttrName = "returns"
/ "returnTypes"
retAttrValue = [ "(" [ retTypes ] ")" ]
mimeCAttr = "mime.content=" mimeCAttrVal
mimeCAttrVal = # RFC 6838 中 MIME 类型的 ABNF
mimeTAttr = "mime.type=" 1*( ALPHA / DIGIT )
mimeDAttr = "mime.dataurl"
示例
示例 1
web3://0x91cf36c92feb5c11d3f5fe3e8b9e212f7472ec14/accessorizedImageOf/1289?mime.content=image/svg%2Bxml
其中合约处于自动模式。
该协议将使用 ERC-6860 中定义的消息调用合约 0x91cf36c92feb5c11d3f5fe3e8b9e212f7472ec14
,并且返回的 Content-Type
标头将设置为 image/svg+xml
。
示例 2
web3://0x91cf36c92feb5c11d3f5fe3e8b9e212f7472ec14/accessorizedImageOf/1289?mime.type=svg
其中合约处于自动模式。
该协议将使用 ERC-6860 中定义的消息调用合约 0x91cf36c92feb5c11d3f5fe3e8b9e212f7472ec14
,并且返回的 Content-Type
标头将设置为 image/svg+xml
。
示例 3
web3://0xff9c1b15b16263c61d017ee9f65c50e4ae0113d7/tokenURI/100?mime.dataurl
其中合约处于自动模式,并且返回的数据是 data:application/json,["xx"]
。
该协议将使用 ERC-6860 中定义的消息调用合约 0xff9c1b15b16263c61d017ee9f65c50e4ae0113d7
,并根据 RFC 2397 data URL 标准解码数据。返回的输出将是 ["xx"]
,并且返回的 Content-Type
标头将设置为 application/json
。
理由
该标准使用三个不同的查询参数而不是单个查询参数,以避免混淆 - 实现者或用户可以轻松地判断链接的预期返回 MIME。 此外,在自动模式下,查询参数不用于形成 EVM 消息(例如,calldata),因此引入新的查询参数是安全的。
安全注意事项
这些新的查询参数引入了跨站脚本攻击向量:攻击者可以利用他可以影响的字符串或字节返回方法,通过使它们返回他注入的未经过滤的数据,然后构造一个 URL 以使返回的数据被解释为 HTML,然后将 URL 发送给受害者。 如果 web3 主机名是众所周知的,受害者可能会产生错误的安全性意识。
使用 JavaScript 的恶意行为范围广泛,可能包括:
- 提取 Web 存储 API(cookies、localStorage、sessionStorage、indexedDB)的数据,发送给攻击者
- 触发签名请求或交易确认请求(通过钱包 JavaScript 接口)
跨站脚本是 HTTP 网站中的一种经典攻击向量,我们希望开发人员对此保持警惕。尽管如此,指定 MIME 类型的功能是不寻常的。应不鼓励使用 auto
模式网站,并充分记录攻击向量。
版权
版权及相关权利通过 CC0 放弃。
Citation
Please cite this document as:
Qi Zhou (@qizhou), Nicolas Deschildre (@nand2), "ERC-7087: 自动模式下 Web3 URL 的 MIME 类型 [DRAFT]," Ethereum Improvement Proposals, no. 7087, May 2023. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7087.