Alert Source Discuss
⚠️ Draft Standards Track: ERC

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-TypeERC-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.