javascript – 即使有一个概念调用同源策略,我们如何加载图像?

前端之家收集整理的这篇文章主要介绍了javascript – 即使有一个概念调用同源策略,我们如何加载图像?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我正在使用HTMLJavaScript构建小型离线Web应用程序. CSV文件用于存储数据.

要读取CSV(使用jquery-csv库)文件,我使用以下代码.

但由于跟随错误,我无法阅读它.

XMLHttpRequest cannot load
file:///C:/Users/Nimal/Desktop/javascript-csv/data.csv. Cross origin
requests are only supported for protocol schemes: http,data,chrome,
chrome-extension,https

然后我可以了解相同的原产地政策概念.

然后,我从这里找到了许多相关的文章.

> @L_404_2@
> XMLHttpRequest cannot load file. Cross origin requests are only supported for HTTP
> Ways to circumvent the same-origin policy

来自维基百科,

In computing,the same-origin policy is an important concept in the
web application security model. Under the policy,a web browser
permits scripts contained in a first web page to access data in a
second web page,but only if both web pages have the same origin.

但我有一个问题.

如果我使用< img src =“abc.jpg”>我可以加载图像.

为什么图像有例外?

我们如何加载图像,但我们无法加载其他文件类型?

我认为相同的原始政策应该应用所有文件类型,包括图像.

或者我是否错误地理解了同一个orgin-policy?

最佳答案
要理解这个问题,您必须了解相同的原始策略(以下称为sop)以及如何处理它.编写允许用户浏览万维网的应用程序时,这是一个重要的概念.在此概念出现之前,已发生许多违规行为.

简而言之,您可以将sop视为具有三个元素的元组:( scheme,host,port).

>方案:协议. HTTP和HTTPS不同.
>主持人:计划后的网址. stackoverflow.com与google.com不同
> port:https://stackoverflow.comhttps://stackoverflow.com:9876/question不同(原因:默认端口通常为80)

当您访问包含从多个URL获取信息的脚本的页面时.这个页面上的元组是例如. tuple_main.如果脚本从另一个URL加载内容,则会从URL:tuple_request生成元组.这里可能出现两种情况:

1) tuple_main == tuple_request
 ===> OK  => get content

2) tuple_main != tuple_request
 ===> NOK => do not get content and show that sop is being violated.

最初,发明了sop来保护DOM中的内容免受恶意攻击者的攻击.多年来,这已经扩展到保护浏览器正在处理的信息的其他部分.最值得注意的例子是全局javascript变量. 10年前,开发人员开始将javascript中的合理信息存储为全球空间中的var foo.恶意攻击者很容易得到并滥用它……

这些年来,其他扩展程序被添加到安全的Adobe Flash,MS Silverlight插件,javascript机制(如XMLHttpRequest)等等. sop确保您访问的网页内容不会泄露给恶意攻击者(主要是XSS)

现在,您的问题最初(这是对问题的描述):

To read CSV (using jquery-csv library) file I use following code.

06001

But I can’t read it because of following error.

XMLHttpRequest cannot load file:///C:/Users/Nimal/Desktop/javascript-csv/data.csv. Cross origin requests are only supported for protocol schemes: http,chrome-extension,https

由于元组不同,你违反了sop.所以你当然会得到这个消息.

但你的主要问题是

If I use I can load the image.

Why is there an exception for images?

为了回答这个问题,这里使用了另一个概念和(呃……)一些历史(旧IE年龄).为了让开发人员能够使用来自不同位置的资源,增加了跨源概念.从这个概念来看,有三种机制(source):

>跨源写入.

在这里,我们讨论的是到其他站点链接,HTTP重定向和表单提交.

>跨源读取

“从另一个来源阅读”是不鼓励的.但是你可以通过嵌入它来解决它.这引出了我们最后的机制:

>跨源嵌入

这是您在加载csv文件时所做的事情.添加此机制是为了允许Web开发人员使用来自其他来源(如样式表,脚本,图像)的内容……您可以将此视为“同源策略原则的例外”.

如果您正在构建网页并且想要使用jQuery(脚本),那么浏览器将加载该脚本.但嵌入式.您可以运行该脚本,但不能读取< script>的内容.标签.

这就是图像中发生的事情.通过< img>加载图片标签,浏览器只读取图像.它无法访问内容(描述整个图像的文件名后面的字节信息).因此,您可以在您正在查看的页面上看到图像.

如果要在< canvas>中加载图像元素,然后它将无法这样做,因为它违反了规则.您的脚本正在尝试访问该文件名后面的字节信息.这是不允许的.

我为什么要谈论IE历史?好吧,很久以前,IE是主流浏览器.由于许多公司开始“上线”,他们已经构建了使用IE进行业务任务的应用程序.例如,财务员工使用IE来获得每月的销售总结.

但是同样的原产地政策并没有像现在这样延伸.从其他域加载源“不是问题”.公司开始使用第三方脚本设置网站(当时大量使用Ext js),第三方样式表和“第三方”图像.万维网上有一些免费使用的图像(由tinypic,imageshack等网站托管).很多公司都将这些图像用于他们的网站.

如果没有实施这些例外,那么许多遗留网站就会破裂.图像无法加载.脚本不会运行.修理它的经济成本将是巨大的.因此,为了预测这一点,这个嵌入机制得到了补充.

个人说明:我很高兴这个例外存在,否则维护一个网站将成为开发人员的噩梦.如果sop按预期严格,那么您必须下载脚本和图像并从服务器托管它.这样,您的网站就可以访问这些并使用它们.如果脚本有更新,则必须下载并覆盖本地脚本…

您正在尝试读取违反嵌入机制背后的安全措施的csv文件内容.由于它包含不应泄漏给恶意攻击者的合理信息,浏览器会通知您无法加载它.只是为了防止你遇到一些安全问题.

如果你想在本地工作,你必须使用CORS.或者在没有限制的情况下启动浏览器(虽然我不推荐它).

原文链接:https://www.f2er.com/js/429208.html

猜你在找的JavaScript相关文章