我曾经能够(本地)使用以下两个Chrome扩展中的任何一个来轻松地将jQuery注入到尚未拥有jQuery的页面中,并且我没有(客户端)来试验设计更改,开发修改和实时故障排除:
不幸的是,现在因为看起来是防止“XSS”(跨站点脚本)的最新热潮,这些插件不再起作用。这些变化背后可能有一个崇高的目的,我只是想了解改变了什么。我认为这与“内容安全政策”有关,我最近才听说过这个政策并且对此知之甚少。
我在2011年首次了解到XSS作为浏览器问题,然而,XSS预防措施从未妨碍我以前进行本地开发。我一直在寻找现代(2017年末)的解决方案,但无济于事。
我不知道从哪里开始。
以下是我尝试的插件(以前大约6个月前工作)不再适用于我:
以下是我遇到的一些提供解决方案的链接,这些链接不再有效:
最后一个也看起来很有希望,但我还没有尝试过:
这是一个一直对我有用的直接方法:
var jq = document.createElement('script');
jq.src = "https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js";
document.getElementsByTagName('head')[0].appendChild(jq);
// ... give time for script to load, then type (or see below for non wait option)
jQuery.noConflict();
只需将每一行粘贴到控制台中,一次一个。 (实际上,如果选择前三行并将它们全部粘贴到DevTools控制台中,它可以正常工作)。
然后,在DevTools控制台中,测试它:
$('div').length; //press Enter
如果您收到错误,请尝试以下方式:
jQuery('div').length
希望第一种方法可行 - 但有时您需要使用第二种方法。
希望我可以将此代码声称为我自己的代码,但这要归功于jondavidjohn。请访问下面引用的链接并UPVOTE他的解决方案。
参考:
使用Snippets。
不幸的是,现在因为看起来是防止“XSS”(跨站点脚本)的最新热潮,这些插件不再起作用。这些变化背后可能有一个崇高的目的,我只是想了解改变了什么。我认为这与“内容安全政策”有关,我最近才听说过这个政策并且对此知之甚少。
是。这些插件不起作用的原因是因为它们与恶意攻击者可以注入任意JavaScript的MITM(中间人)攻击无法区分。 CSP(内容安全策略)旨在通过仅从源白名单运行受信任的JavaScript来防止这种情况发生。不幸的是,在开发人员将插件作者的JavaScript / CSS注入白名单之前,目前还没有简单的方法可以在Chrome或Firefox中处理这个问题。这不可能发生,因为Chrome有关于如何遵守CSP政策的guide for app developers。
同时,我建议你了解XSS上的OWASP文章,这样你就可以了解为什么它如此重要。
不推荐的方法
您可以从Chrome商店下载“禁用内容 - 安全政策”插件。仅用于本地开发。请记住,如果您这样做,恶意ISP或专门的攻击者仍然可以在MITM攻击中注入脚本(例如,如果他们控制了您的路由器)。
推荐的方法
不要注入jQuery,而是将它放在你的页面中。添加一个CSP标签:
<meta http-equiv="Content-Security-Policy" content="...">
在这里你可以放一些类似default-src 'self'; script-src https://cdn.com/jquery
的地方,其中cdn.com
是你从中下载jQuery的地方。更进一步,添加一个subresource integrity hash。如果CDN遭到入侵,变得恶意,或者您成为MITM,则哈希将不匹配,并且不会加载恶意脚本。此外,出于同样的原因,你永远不会真正信任插件。
如果您决定不使用CDN,则可以使用将为您下载特定版本的jQuery的包管理器(如node或Bower)。然后只需在本地加载它。当然,对于制作而言,您通常希望使用CDN,以便访问者可以从更近的数据中心下载。此外,如果您使用的是Cloudflare,它们可能会缓存特定版本的jQuery,因此他们不必继续下载它。
原型
如果你的动机是原型,那么有一些解决方法:
不推荐:您可以抓取网站,进行修改,然后呈现给客户。
推荐:您应该进行快速原型设计,而不是在实时网站上进行修改。这样做的好处是:
你可以创建一个非常基本的chrome扩展,它只是在每个页面上注入JQuery。 Getting started with chrome extensions。您可以使用这段代码在清单本身中指定它。
"content_scripts": [
{
"matches": ["*"],
"js": ["jquery.min.js"] }
]
请注意,匹配中的*将在每个网页上注入脚本。你也可以提供不同的模式。例如,“www.abc.com/*”将匹配以“www.abc.com”开头的所有URL,并且仅在这些页面上注入脚本。
改善方案
更好的方法是创建一个chrome扩展,当你点击扩展图标时,它可以在当前标签中注入你的JavaScript文件。
制作后台脚本并在清单中指定它。
的manifest.json
{
"name": "My Extension",
"version": "0.1",
"manifest_version": 2,
"description": "inject script",
"browser_action": {
"default_icon": "logo.png"
},
"permissions": [
"activeTab"
],
"background": {
"scripts": ["background.js"]
}
}
在后台脚本中,侦听扩展图标上的单击并在currert选项卡中注入jquery。
background.js
chrome.browserAction.onClicked.addListener(function(tab) {
chrome.tabs.executeScript(null, {file: "jquery.min.js"});
});