Dart WebUI中的base64 img src导致错误

Dart WebUI中的base64 img src导致错误,dart,dart-webui,Dart,Dart Webui,以下是模板中有问题的部分: {{file.filename} 来源:{{file.src} convertedfiles是AndroidFile的列表: 类AndroidFile{ 文件\u文件; 字符串文件名; 字符串src; 布尔·伊斯梅; AndroidFile(此._文件):isImage=false{ filename=htmlEscape(_file.name); //如果文件是图像,则读取并显示其缩略图。 if(_file.type.startsWith('image')

以下是模板中有问题的部分:

  • {{file.filename}
    来源:{{file.src}
convertedfiles是AndroidFile的列表:

类AndroidFile{ 文件\u文件; 字符串文件名; 字符串src; 布尔·伊斯梅; AndroidFile(此._文件):isImage=false{ filename=htmlEscape(_file.name); //如果文件是图像,则读取并显示其缩略图。 if(_file.type.startsWith('image')){ FileReader=新的FileReader(); reader.on.load.add((e){ src=reader.result.toString().trim(); //打印正确的URL(数据:image/png;base64,…) 印刷(src); isImage=true; watcher.dispatch(); }); reader.readAsDataUrl(_文件); } } } 将显示模板。它显示文件名,显示源代码,但imagetag看起来像


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

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

样本源已打开
有什么提示吗?

我发现了问题

这是因为URI由于安全原因而被清除。消毒剂会将无效的URI转换为散列

web\u ui/templating.dart

/**
*确保[usiString]是一个安全的URI。否则,返回“#”URL。
*
*此方法中的逻辑基于位于以下位置的GWT实现:
* http://code.google.com/p/google-web-toolkit/source/browse/trunk/user/src/com/google/gwt/safehtml/shared/UriUtils.java
*/
字符串sanitizeUri(uri){
如果(uri是SafeUri),则返回uri.toString();
uri=uri.toString();
返回_isSafeUri(uri)?uri:'#';
}
const _SAFE_SCHEMES=const[“http”、“https”、“ftp”、“mailto”];
bool_isSafeUri(字符串uri){
var scheme=新Uri(Uri).scheme;
if(scheme='')返回true;
//mailto有两种检查方法可以正确处理土耳其语言环境。
//i->土耳其语地区的高音->İ
//我->在土耳其地区降低->ı
//有关详细信息,请参阅:http://www.i18nguy.com/unicode/turkish-i18n.html
返回_SAFE_SCHEMES.contains(scheme.toLowerCase())||
“MAILTO”==scheme.toUpperCase();
}
因此,消毒剂将您的
数据:
方案URI转换为
#
。数据URI可以用于XSS,但据我所知,当数据URI内容类型为
image/*
时,允许使用数据URI可以改进检查

也许要提交一份bug报告?

我发现了问题

这是因为URI由于安全原因而被清除。消毒剂会将无效的URI转换为散列

web\u ui/templating.dart

/**
*确保[usiString]是一个安全的URI。否则,返回“#”URL。
*
*此方法中的逻辑基于位于以下位置的GWT实现:
* http://code.google.com/p/google-web-toolkit/source/browse/trunk/user/src/com/google/gwt/safehtml/shared/UriUtils.java
*/
字符串sanitizeUri(uri){
如果(uri是SafeUri),则返回uri.toString();
uri=uri.toString();
返回_isSafeUri(uri)?uri:'#';
}
const _SAFE_SCHEMES=const[“http”、“https”、“ftp”、“mailto”];
bool_isSafeUri(字符串uri){
var scheme=新Uri(Uri).scheme;
if(scheme='')返回true;
//mailto有两种检查方法可以正确处理土耳其语言环境。
//i->土耳其语地区的高音->İ
//我->在土耳其地区降低->ı
//有关详细信息,请参阅:http://www.i18nguy.com/unicode/turkish-i18n.html
返回_SAFE_SCHEMES.contains(scheme.toLowerCase())||
“MAILTO”==scheme.toUpperCase();
}
因此,消毒剂将您的
数据:
方案URI转换为
#
。数据URI可以用于XSS,但据我所知,当数据URI内容类型为
image/*
时,允许使用数据URI可以改进检查


可能会提交错误报告?

请注意,如果您知道您正在处理一个不易受XSS攻击的安全URI,您可以使用安全URI包装(从
web\u ui/web\u ui.dart
导入)来解决此问题。例如,将模板更改为:


致:



或者在内部更改file.src以存储安全URI

请注意,如果您知道您正在处理一个不易受XSS攻击的安全URI,您可以通过使用安全URI包装(从
web\u ui/web\u ui.dart
导入)来解决此问题。例如,将模板更改为:


致:



或者在内部更改file.src以存储安全URI

如果有人想跟随,问题就在这里…如果有人想跟随,问题就在这里…谢谢Siggi!非常好的支持。在我的情况下(SDK 0.2.9.9_r16323和WebUI 0.2.9),我必须使用:import'package:web_ui/safe_html.dart';safeuri=新的safeuri.unsafe(src);来存储SafeUri。只有此命名构造函数。但是有了这个,它就完美了。它现在是新的SafeUri.unsafe()。我会更新答案的。谢谢Siggi!非常好的支持。在我的情况下(SDK 0.2.9.9_r16323和WebUI 0.2.9),我必须使用:import'package:web_ui/safe_html.dart';safeuri=新的safeuri.unsafe(src);来存储SafeUri。只有此命名构造函数。但是有了这个,它就完美了。它现在是新的SafeUri.unsafe()。我会更新答案。