是否可以通过<;将JavaScript文件的源加载到网页中;脚本>;标签会被该页面中的其他JavaScript读取吗?

是否可以通过<;将JavaScript文件的源加载到网页中;脚本>;标签会被该页面中的其他JavaScript读取吗?,javascript,json,security,csrf,csrf-protection,Javascript,Json,Security,Csrf,Csrf Protection,我正在研究CSRF预防,我有一个关于返回JSON的GET URL的问题,以及该URL返回的数据是否可以通过第三方网页访问 例如,假设这个请求 GET HTTP 1.1 /rest/foo.js Host: myhost.com 返回动态生成的JSON,如下所示,带有每会话CSRF令牌: {user:“我的名字”,userId:1234,CSRFToken:“EFB8765AC2134ACB23486} 请注意,这不是JSONP请求。现在,假设我在SleekyThirdParty.com上有

我正在研究CSRF预防,我有一个关于返回JSON的GET URL的问题,以及该URL返回的数据是否可以通过第三方网页访问

例如,假设这个请求

GET HTTP 1.1 /rest/foo.js 
Host: myhost.com
返回动态生成的JSON,如下所示,带有每会话CSRF令牌:

{user:“我的名字”,userId:1234,CSRFToken:“EFB8765AC2134ACB23486}
请注意,这不是JSONP请求。现在,假设我在SleekyThirdParty.com上有一个网页,内容如下:


...
我的问题是:脚本、Flash小程序或第三方网站(如本网站)页面中的任何其他内容是否可以阅读foo.js的源代码以获取CSRF令牌?

是的,
标记可以让所有人看到

例如:

var nodes = document.querySelectorAll("script");
var i;
for (i = 0; i < nodes.length; i++) {
    if (nodes[i].hasAttribute('src'))
        console.log(nodes[i].attributes["src"].value);
}
var节点=document.querySelectorAll(“脚本”);
var i;
对于(i=0;i
只需执行一个简单的XMLHttpRequest来获取源代码和CRSFToken

编辑:

这种方法依赖于支持,并基于以下假设:来自同一客户端(使用相同cookies)的两个对myhost.com的请求将使用相同的CRSFToken进行响应

如果上述任何一项都不成立,这种方法将不起作用。如果“外部”进程(如Flash或Java)可以访问相同的cookie,理论上它们可以模拟请求并获取CSRFToken(假设上述第二个条件成立)


除此之外,如果您不信任用户(或用户的计算机),可以从内存中获取CSRF令牌,但这似乎超出了您的问题范围。

您不必隐藏CSRF令牌 CSRF保护的全部目的只是确保对您站点的请求确实来自您的站点(或您可以授权的其他站点)

所以我真的不明白你在你的例子中想要实现什么: 如果您想阻止foo.js从另一台服务器调用,您必须强制人们在请求该文件时发送CSRF令牌,然后在服务器中检查该令牌是否与会话密钥(例如,前面设置的用于验证用户最初确实来自您的站点的会话密钥)匹配

如果json{user:“My name”,userId:1234,CRSFToken:“EFB8765AC2134ACB23486”}是用这个javascript静态编写的,那么您就误解了CSRF保护的所有概念

您必须根据一些用户唯一的数据(可以是数据库中的数据,也可以是会话id等)动态创建令牌,然后在站点周围传递令牌,并阻止对要保护的页面的请求(如果该令牌无效/不存在)

CSRF保护可以在常规形式和ajax调用中完成,这取决于您选择的方式


谢谢tjameson的回复,但这会返回一个URL列表,我问的是URL的源代码,而不是脚本标记的源URL-我已经更新了我的问题来澄清这一点。这很简单,只需使用XMLHttpRequest即可。一旦你有了URL,剩下的就不重要了。当然,我假设来自同一个客户端的两个对同一URL的请求将产生相同的CRSFToken。这是真的,但是由于相同的源策略,从SkileythirdParty.com到myhost.com的XMLHttpRequest不起作用。我的问题是,有什么办法可以绕过这个问题吗?@Ian你的myhost.com支持吗?它支持,但使用它将完全实现我想要确保的在这种情况下是不可能的:-)嗨,阿迪迪,JSON绝对不是静态的,我同意这是没有用的:-)我将更新这个问题,以澄清这一点。我想确定通过服务器端REST调用检索到的CSRF令牌是第三方无法获得的。答案是肯定的!任何第三方都可以读取javascript文件——这就是为什么他们称之为客户端文件。如果您想阻止它或控制json最终将包含什么,那么您需要检查谁调用了您的文件,并根据它对其进行操作。而且CSRF保护在这里也很棒!要不是那个文件!我很抱歉,但我认为没有那么清楚。。。我问的是第三方网页。同源策略应该停止在第三方网页中加载文件,我的问题基本上是,是否有办法解决这个问题,因为它是通过标记加载的,并且是JSON。好吧,您可以将JSON文件转换为服务器文件并在那里生成。(在服务器中,您只需定义响应头内容类型为text/javascript即可)-然后您就可以完全控制文件返回的内容。