如何防止外部JS请求

时间:2015-09-22 11:30:37

标签: javascript

我正在使用自动构建和托管启动页面的服务。在他们的代码正文中,他们调用了jquery:

<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js?cache=2015-09-22-09">

不幸的是,由于我在中国,googleapis.com被阻止,并且页面必须等待此代码在呈现之前超时。此部分是作为模板的一部分自动生成的,我无法对其进行更改。但是我可以在头部和身体中插入自定义javascript。

有什么方法可以阻止此代码向googleapis.com发出请求,或者在它已经发出请求后强制它中止?

- 编辑 -

当我尝试加载页面时,这是网络标签的屏幕上限。正如您所看到的,对googleapis.com的调用会持续1.4分钟,直到超时,此时DomContentLoaded会触发并加载整个页面。

enter image description here

4 个答案:

答案 0 :(得分:17)

是的,如果你能够将html放在文档的头部,而不仅仅是执行javascript,你可以使用元标记来阻止外部脚本加载:

<meta http-equiv="Content-Security-Policy" content="script-src 'self'">

来自Mozilla Content-Security-Policy Meta Tag Docs

  

强烈建议作者尽可能早地在元文档中放置元元素,因为元元素中的策略不会应用于前导它们的内容。特别要注意的是,使用链接HTTP响应头字段获取或预取的资源,以及使用元交付策略之前的链接和脚本元素获取或预取的资源将不会被阻止。

因此元标记只能在头部工作,当然在加载jQuery的脚本之前。您可以将标记中的网址添加到元标记的content参数中,然后将其列入白名单。

如果您只能执行javascript,则可以动态添加元标记。不幸的是,浏览器很可能在添加时已经决定了它的策略。不过,它可以添加

var meta = document.createElement('meta');
meta.httpEquiv = "Content-Security-Policy";
meta.content = "script-src 'self'";
document.getElementsByTagName('head')[0].appendChild(meta);

更有趣的阅读材料作业,用于解决“防止外部js请求”#39;谜:

Use JavaScript to prevent a later `<script>` tag from being evaluated?

祝你好运!

答案 1 :(得分:7)

考虑使用Content Security Policy。这将是一个不寻常的用例,但使用CSP,您可以告诉浏览器,在您的政府甚至在此事上发表意见之前,不允许访问googleapis.com。这样,浏览器甚至不会尝试加载它,页面也不会挂起。

答案 2 :(得分:1)

呀。 @Niet的建议似乎很好。要添加他的答案,以下是使用CSP阻止googleapi域渲染的方法:

Content-Security-Policy: script-src 'self';

此代码将指示浏览器仅执行您自己的域脚本。

答案 3 :(得分:1)

如果您可以访问Web服务器及其窗口,则可以在Hosts文件中添加一个条目,将google地址重定向到本地服务器Web应用程序,从那里下载javascript? (如果你匹配javascript链接的文件夹结构)

MATCH (d:Decision) WHERE id(d) IN {decisionsIds} 
OPTIONAL MATCH (d)-[r]-(t) 
WITH t, collect(r) as rels 
  WHERE NOT (t:User OR t:Decision) AND NOT (id(t) IN {decisionsIds})
OPTIONAL MATCH (t)-[r2:VOTED_ON|:CREATED_BY|:VOTED_FOR|:CONTAINS]-(t1)
  WHERE NOT (r2 in rels)
OPTIONAL MATCH (t1)-[:CONTAINS]-(t2)
RETURN *;