SecurityException 1000,即使使用相同的域
Posted
技术标签:
【中文标题】SecurityException 1000,即使使用相同的域【英文标题】:SecurityException 1000, even though using same domain 【发布时间】:2011-08-05 13:06:44 【问题描述】:我正面临一个棘手的 javascript/Firefox 问题。 相关代码如下。
基本上发生的情况如下: 1. document.ready 触发并启动 AJAX 请求(到 document.domain:8484/getTrack.php 或其他) 2. 收到 AJAX 响应。此响应包含图像位置的 url(相同域)。因此,设置了 sourceImage.onload,然后设置了 sourceImage.src 3. sourceImage.onload 触发。现在的想法是将调整大小的图像保留在内存中,以完全适合将要绘制的画布。我想将这个调整大小的图像保存在内存中,因为我要多次将它(部分)写入我的画布,并且每次调整大小应该会慢很多。
var SourceImage = new Image(); varpreparedImageData; sourceImage.onload = function() var canvas = document.createElement('canvas'); 画布.宽度 = 100;画布.高度 = 100; var ctx = canvas.getContext("2d"); // 调整图像大小 ctx.drawImage(sourceImage, 0, 0, sourceImage.width, sourceImage.height, 0, 0, canvas.width, canvas.height); // 保存为图像数据 尝试 尝试 PreparedImageData = ctx.getImageData(0, 0, canvas.width, canvas.height); 抓住(e) netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead"); PreparedImageData = ctx.getImageData(0, 0, canvas.width, canvas.height); 抓住(e) throw new Error("无法访问图像数据:" + e)第一个 getImageData 调用抛出,enablePrivilege 调用也立即抛出。错误文本是“来自“http://127.0.0.1”的脚本被拒绝 UniversalBrowserRead 权限。”。我已经检查过,这些消息似乎只应在尝试从另一个域访问图像上的 getImageData 时出现,但事实并非如此(对吗?)。没有严格的安全策略(一切默认),Firefox 4.0。相同的代码在 Chrome 上运行良好。
【问题讨论】:
您是否从同一个端口运行页面? XMLHttp 请求只允许使用相同的协议、域和端口。 不是同一个端口。 image.src 网址虽然在端口 80 上。当图像的 onload 事件触发时,这仍然重要吗? 只要图像加载,onload 事件就会触发 - 这并不意味着您可以访问它。 【参考方案1】:只要我设置了document.domain = document.domain
,context.getImageData
和PrivilegeManager.enablePrivilege
调用就会失败,这是为了与托管在不同子域上的 iframe 合作而完成的。作为一种解决方法,我将 domain.tld/subdomain/ 代理到 subdomain.domain.tld/ 并获得了所需的结果。
【讨论】:
【参考方案2】:通过'same origin' ref Same Origin Policy,协议、主机名和端口必须相同。我猜你在这里使用不同的端口?
我认为您对netscape.security.PrivilegeManager.enablePrivilege
的调用由于脚本不是signed 而失败 - 您是否尝试删除此代码?
【讨论】:
确实,image.src 是在设置 AJAX 响应时设置的。但是,getImageData 调用是在 image.onload 事件中进行的。那么 image.src 是从 AJAX 来源设置的事实仍然相关吗?我想在 AJAX 服务器之前放置一个代理是可能的。 ajax 部分根本不相关 :) 在这种情况下,托管图像的协议、主机名和端口与网络浏览器指向的协议、主机名和端口相同。 我想您对脚本未签名的看法是正确的。这一切似乎都很麻烦。如果我想测试它,我真的必须在每次修改后重新签署脚本吗? Chrome 不需要任何这些是一个“缺陷”吗? 是的,您需要在每次修改后签名 - 这就是签名的重点(没有人可以修改它)。netscape....
语句是 Mozilla 特有的,会在 Chrome 中抛出 TypeError 或其他内容,但由于这只是在 catch 块中,我猜 Chrome 永远不会在其中结束。以上是关于SecurityException 1000,即使使用相同的域的主要内容,如果未能解决你的问题,请参考以下文章
为啥 NotificationManagerCompat::cancelAll() 得到 SecurityException?