For AI agents: the complete documentation index is available at /tc39-atlas/llms.txt, the full documentation bundle is available at /tc39-atlas/llms-full.txt, and this page is available as Markdown at /tc39-atlas/proposals/proposal-dynamic-import-host-adjustment.md.
  • 简体中文
  • Dynamic Import Host Adjustment ?

    中文标题:动态导入宿主调整

    提案概览
    提案速览

    该提案解决动态导入运算符的安全问题,通过赋予宿主对模块加载更多的控制权。它调整了宿主回调,使其能够接收原始说明符(在字符串化之前)并控制字符串化过程,与可信类型集成。

    Note

    以下 README 来自上游仓库,其中的阶段或状态标注可能滞后;当前信息以提案概览为准。

    动态导入宿主调整

    阶段2
    规范源代码输出
    测试待办
    拥护者@mikesamuel
    审阅者@bakkot, @erights, @bmeck

    可信类型 保护敏感 API;在对不可撤销的操作执行之前,它会双重检查值是否已通过策略代码获得信任。

    动态导入运算符 import(...) 会加载代码并初始化模块。从不值得信任的来源加载代码是一个无法撤销的操作。

    此提案调整了启用动态加载的宿主回调。有了它:

    1. 宿主会收到原始的说明符(在字符串化之前),因此可以使用运行时类型信息来决定是否允许代码加载继续进行。
    2. 宿主回调可以控制字符串化过程并将结果传递给 FinishDynamicImport,以避免重复字符串化,并与默认策略集成。

    测试

    将要编写的测试将以 web-platform-tests 的形式实现,并将重点放在以下属性上:

    1. 多态对象只被字符串化一次。类似如下:
      importScripts("/resources/testharness.js");
      
      test(
        () => {
          let stringifyCount = 0;
          import({
            toString() {
              let specifier = `data:text/javascript,export default ${ stringifyCount }`;
              ++stringifyCount;
              return specifier;
            }
          })
          .then(
            (defaultExport) => {
              assert_equals(stringifyCount, 1);
              assert_equals(defaultExport, 0);
            },
            (err) => {
              assert_equals(err, null);
            })
          .finally(done);
        },
        'DynamicImportStringifiesSpecifierOnce');
    2. 上述情况,同时覆盖 null 和非 null 引用模块。
    3. 针对可信类型宿主实现的具体测试。

    另请参见 webappsec-csp #243 关于 import('data:...') 作为 CSP 绕过的问题。