- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 Angular JS 中有一个指令,允许将 SVG 导出为 PNG。这在其他浏览器中工作正常,但在 IE 中我收到安全错误。我尝试了各种各样的方法,但似乎不起作用。我在某处读到,如果我对其进行 base64 编码,那么就可以工作,但事实并非如此。
我在 Canvas 上绘制 SVG 的代码是这样的:
// Private function for drawing our images
var drawImage = function (canvas, ctx, svgContainer) {
// Defer our promise
var deferred = $q.defer();
// Remove hidden layers
removeHidden(angular.element(clone));
// Create our data
var clone = angular.element(svgContainer[0].cloneNode(true)),
child = clone.children()[0];
// Remove hidden layers
removeHidden(angular.element(clone));
var s = new XMLSerializer(),
t = s.serializeToString(child),
base64 = 'data:image/svg+xml;base64,' + window.btoa(t);
console.log(base64);
var img = new Image();
// When the image has loaded
img.onload = function () {
// Create our dimensions
var viewBox = child.getAttribute('viewBox').split(' ');
console.log(viewBox);
var dimensions = {
width: viewBox[2],
height: viewBox[3]
};
console.log(img.width);
// Get our location
getNextLocation(canvas.width, canvas.height, dimensions);
// Draw our image using the context
ctx.drawImage(img, 0, 0, dimensions.width / 2, dimensions.height, location.x, location.y, location.width, location.height);
// Resolve our promise
deferred.resolve(location);
};
// Set the URL of the image
img.src = base64;
// Return our promise
return deferred.promise;
};
在此之前,我创建了一个 blob,但这也导致了安全错误。我的主要代码是这里:
// Public function to generate the image
self.generateImage = function (onSuccess) {
// Reset our location
location = null;
counter = 0;
// Get our SVG
var target = document.getElementById(self.options.targets.containerId),
svgContainers = angular.element(target.getElementsByClassName(self.options.targets.svgContainerClassName)),
itemCount = svgContainers.length;
// Get our context
var canvas = document.getElementById('canvas'),
ctx = canvas.getContext('2d');
// Set our canvas height and width
setCanvasDimensions(canvas, itemCount);
// Create our array of promises
var promises = [];
// Draw our header and footer
drawHeader(canvas, ctx);
//// For each container
//for (var i = 0; i < itemCount; i++) {
// // Get our elements
// var svgContainer = svgContainers[i];
// // Draw our image and push our promise to the array
// promises.push(draw(canvas, ctx, svgContainer));
//}
promises.push(draw(canvas, ctx, svgContainers[0]));
// Finally add our footer to our promises array
promises.push(drawFooter(canvas, ctx));
// When all promises have resolve
$q.all(promises).then(function () {
console.log('all promises completed');
// Get our URL as a base64 string
var dataURL = canvas.toDataURL("image/png");
console.log('we have the image');
// Create our model
var model = {
teamName: self.options.team.name,
sport: self.options.team.sport,
data: dataURL
};
// Create our preview
self.create(model).then(function (response) {
console.log('saved to the database');
// Invoke our success callback
onSuccess(response);
});
})
};
如您所见,我循环遍历每个 svg 容器并为每个容器绘制 SVG。我已经在这段代码中注释掉了这一点,并且只绘制了第一张图像。canvas.toDateURL 之后的 console.log 指令永远不会被调用,并且我收到安全错误。
SVG 是内联的。根据我的阅读,该问题可能是由于 xlns 声明造成的,但删除它仍然会给我带来问题:
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 259.5 131" enable-background="new 0 0 259.5 131" xml:space="preserve">
有谁知道如何解决这个问题吗?
最佳答案
您需要设置img.crossOrigin='匿名';
前img.src=...
但是,要实现此目的,您还需要访问控制允许来源:*
在图像的响应 header 中设置。
要尝试解决方案,您可以使用 ' http://fabricjs.com/assets/printio.png '(具有正确的 header 设置)例如
关于javascript - SVG 污染 Canvas IE 安全错误 toDataURL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33364396/
我正在尝试将我的插件提交到 mozilla 站点,但我收到了这个该死的警告: 代码(在 mf_options.js 中)非常简单(我认为问题只存在于“开始存储”和“结束存储”之间: // start
精简版 在下面的代码中,$1被污染了,我不明白为什么。 长版 我在运行 Foswiki在带有 -T 的 perl v5.14.2 系统上启用污点检查模式。 调试该设置的问题,我设法构建了以下 SSCC
我有一个 Controller ,其中 $scope 对象已用于存储仅在同一 Controller 中本地使用的方法和值。有很多这样的事情发生: $scope.foo = 'something'; $
我知道将不受信任的对象标记为受污染的可能性,但根本目的是什么,我为什么要这样做? 最佳答案 将污点作为一种安全预防措施进行跟踪,以确保不受信任的数据不会被错误地用于计算、交易或解释为代码。 通过内置语
我正在开始一个新的 react 项目,我刚刚安装了非常基本的包(npx create-react-app),没有任何其他东西。当我运行审核时,我得到以下低漏洞:
我知道关于这个特定主题有很多,但是我找不到任何偶然发现我的问题的人,希望有人可以向我解释这一点。 我有一个域,我在 equals 方法中使用注入(inject)的 grailsApplication
我在程序中使用许多不同的记录,其中一些使用相同的字段名称,例如 data Customer = Customer { ..., foo :: Int, ... } data Product = Pro
我有一个包含 2 个节点组的集群:实时和常规。我只希望能够实时容忍亲和性的 Pod 能够在来自实时集群的节点上运行。 我的方法是污染相关节点并向我要注册到该节点的 pod 添加容忍度。当我试图污染一个
在其中一个回复中,BalusC 已经提到了 初学者的一个常见错误是,他们将 servletcontainer/appserver 的库复制到/WEB-INF/lib 中,因为他们在 IDE 中遇到编译
最近我偶然发现了一个vulnerability in doT.js 。该漏洞的存在是因为攻击者可以利用原型(prototype)污染来修改传入 doT 的选项值。 示例: var doT = requ
我有一个带有多个命名空间的仅 header C++ 库。 例如一个头文件可能包含 //header1.h namespace library{ namespace componentA{ tem
我正在尝试将 svg 转换为图像并提示用户下载。 var chart = $(svg.node()) .attr('xmlns', 'http://www.w3.org/200
在 javascript 中,可以“覆盖”Object.prototype 的属性或方法。例如: Object.prototype.toString = function(){ return "s
当我们要写入一个数据项时,首先将包含数据的块带入缓存,然后将数据项写入缓存。这可能会导致缓存污染。为了避免这种情况,英特尔没有引入临时指令。 如果我要使用 mmap() 将数据写入文件并且永远不会再次
我可以感染一个节点,但不能感染一个实例组。 kubectl taint nodes nodeA kops.k8s.io/instancegroup=loadbalancer:NoSchedule 下面
我的应用程序显示存储在 中的图像AWS S3 (出于安全原因,在私有(private)存储桶中)。 为了让用户从他们的浏览器中看到图像,我生成了 签名 URL 喜欢 https://s3.eu-cen
总结 对于我的 CS 顶点项目,我们遇到了一个类名存在于两个不同依赖项中的问题。具体来说,我们使用一个依赖项将 MySQL 与 Entity Frame 一起使用,一个用于直接连接和执行 MySQL
我在 VS 2005 中有一个 VC++ 项目,我制作了 32 位和 64 位版本。我刚刚安装了 VS 2010 并试图将项目移植到较新的 Visual Studio。它不会移植,因为该项目引用了平台
我正在使用 Struts 2 v 2.3.16.3 和 tomcat 6。 用户将单击一个通过 id 查找对象的操作,页面将显示它。我遇到了一个零星的错误,用户会突然从另一台机器上的另一个用户那里得到
这个问题已经有答案了: Tainted Canvas, due to CORS and SVG? (2 个回答) 已关闭 4 年前。 我在 Angular JS 中有一个指令,允许将 SVG 导出为
我是一名优秀的程序员,十分优秀!