0

这是模板有问题的部分:

<ul id="list">
  <template iterate='file in convertedfiles.files'>
    <li>{{file.filename}}
    <template if='file.isImage'>
      <img src="{{file.src}}" alt="{{file.filename}}"><br/>
      Source: {{file.src}}
     </template>
    </li>
  </template>
</ul>

convertfiles 是 AndroidFile 的列表:

class AndroidFile {
File _file;  

String filename;
String src;
bool isImage;

AndroidFile(this._file) : isImage = false {
    filename = htmlEscape(_file.name);

    // If the file is an image, read and display its thumbnail.
    if (_file.type.startsWith('image')) {
    FileReader reader = new FileReader();
    reader.on.load.add((e) {
        src = reader.result.toString().trim();

        // prints the correct URL (data:image/png;base64,...)
        print(src);
        isImage = true;  
        watcher.dispatch();
      });

    reader.readAsDataUrl(_file);  
    }
  }
}

模板显示出来。它显示文件名,它显示源,但图像标签看起来像

 <img alt="screenshot-1179.png" src="#"> 

哈希带有下划线(在 Chromium 源视图中),如果我单击它,它会显示“找不到文件:/web/out/”

转换为 JS 在 Chrome 中说:“资源解释为图像,但使用 MIME 类型 text/html 传输”

示例源在GitHub 上
有 任何提示吗?

4

2 回答 2

2

请注意,如果您知道自己正在处理不受 XSS 攻击的安全 URI,则可以使用 SafeUri 包装器(从 导入web_ui/web_ui.dart)来解决此问题。例如,将您的模板更改为:

<img src="{{file.src}}" alt="{{file.filename}}">

到:

<img src="{{new SafeUri.unsafe(file.src)}}" alt="{{file.filename}}">

或在内部更改 file.src 以存储 SafeUri。

于 2013-01-02T18:40:59.497 回答
1

我发现了问题。

这是因为出于安全原因对 URI 进行了清理。sanitizer 将无效的 URI 转换为 hash #

来自web_ui/templating.dart

/**
 * Ensure that [usiString] is a safe URI. Otherwise, return a '#' URL.
 *
 * The logic in this method was based on the GWT implementation located at:
 * http://code.google.com/p/google-web-toolkit/source/browse/trunk/user/src/com/google/gwt/safehtml/shared/UriUtils.java
 */
String sanitizeUri(uri) {
  if (uri is SafeUri) return uri.toString();
  uri = uri.toString();
  return _isSafeUri(uri) ? uri : '#';
}

const _SAFE_SCHEMES = const ["http", "https", "ftp", "mailto"];

bool _isSafeUri(String uri) {
  var scheme = new Uri(uri).scheme;
  if (scheme == '') return true;

  // There are two checks for mailto to correctly handle the Turkish locale.
  //   i -> to upper in Turkish locale -> İ
  //   I -> to lower in Turkish locale -> ı
  // For details, see: http://www.i18nguy.com/unicode/turkish-i18n.html
  return _SAFE_SCHEMES.contains(scheme.toLowerCase()) ||
      "MAILTO" == scheme.toUpperCase();
}

因此,sanitizer 会将您的data:方案 URI 转换为#. 数据 URI 可用于 XSS,但据我所知,当数据 URI 内容类型为image/*.

也许提交错误报告?

于 2012-12-31T12:53:13.083 回答