Javascript、ajax、跨域调用、覆盖内容安全策略
Javascript, ajax, cross domain call, overriding Content Security Policy
我解析网页并根据内容,我需要 ajax 调用我的本地主机。
在本地主机上将是一个 PHP 脚本,它将通过 AJAX 交换数据,可能采用 JSON 格式(我还不确定,仍在阅读和测试)。
这是一个插件,我尝试测试 Google 页
我遵循这个简单的 ajax 示例:
https://www.w3schools.com/xml/ajax_xmlhttprequest_response.asp
我自己成功拨打电话
//loadDoc("http://localhost/index.php", myCallback); <-- this NOT
//loadDoc("https://www.google.de", myCallback); <-- this WORKS
/*
Content Security Policy: Ignoring “'unsafe-inline'” within script-src: ‘strict-dynamic’ specified (unknown)
Content Security Policy: Ignoring “https:” within script-src: ‘strict-dynamic’ specified (unknown)
Content Security Policy: Ignoring “http:” within script-src: ‘strict-dynamic’ specified
*/
function loadDoc(url, cFunction) {
var xhttp;
xhttp=new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
cFunction(this);
}
};
xhttp.open("GET", url, true);
xhttp.send();
}
function myCallback(xhttp) {
alert("I'm alive from my local server");
}
(大)问题是我发现 "Content Security Policy" 不允许我调用其他域,即使我在自己的上下文中(我的浏览器,FF 53)也是如此。
现在看来,至少对于我需要的 GET 请求来说,这很容易被欺骗,方法是在 DOM 中插入一个脚本,就像这样
AJAX cross domain call
尤其是 Rob W
这位伟大的 post
Insert code into the page context using a content script
所以我这样试了,还是不行。
// var actualCode = ['/* Code here. Example: */' + 'alert(0);',
// '// Beware! This array have to be joined',
// '// using a newline. Otherwise, missing semicolons',
// '// or single-line comments (//) will mess up your',
// '// code ----->'].join('\n');
var script = document.createElement('script');
script.src = "http://localhost/index.php";
script.type = "text/javascript";
document.appendChild(script);
// script.textContent = actualCode;
// (document.head||document.documentElement).appendChild(script);
// script.remove();
安全性不是问题,因为我将只使用本地主机。
我在这里想念什么?
已编辑
这些是 Firefox 调试器显示的错误
Blocked loading mixed active content “http://localhost/index.php”[Learn More] axtest.js:16
Content Security Policy: Ignoring “'unsafe-inline'” within script-src: ‘strict-dynamic’ specified (unknown)
Content Security Policy: Ignoring “https:” within script-src: ‘strict-dynamic’ specified (unknown)
Content Security Policy: Ignoring “http:” within script-src: ‘strict-dynamic’ specified
将其附加到 body 或 head 元素,而不是根元素 document
:
document.body.appendChild(script);
混合活动内容错误是由于通过 https(SSL) 加载初始页面然后尝试加载 http(不安全)URL。要么在没有 https 的情况下加载页面,要么在您调用的 URL 上设置 https。
尽管我已经接受了一个答案,但我找到了一个非常适合我的情况的简单解决方案。 都是本地浏览器安全策略,无需注入任何JS代码。
首先,插件的 manifest.json 必须用这个更新
"permissions": [
"history",
"browsingData",
"tabs",
"<all_urls>",
"http://localhost/*",
"storage"
]
其次(感谢@Quentin)需要重新配置本地浏览器策略。通过在 about:config 菜单
中禁用 security.csp.enable 来关闭整个浏览器的 CSP
我解析网页并根据内容,我需要 ajax 调用我的本地主机。 在本地主机上将是一个 PHP 脚本,它将通过 AJAX 交换数据,可能采用 JSON 格式(我还不确定,仍在阅读和测试)。
这是一个插件,我尝试测试 Google 页
我遵循这个简单的 ajax 示例:
https://www.w3schools.com/xml/ajax_xmlhttprequest_response.asp
我自己成功拨打电话
//loadDoc("http://localhost/index.php", myCallback); <-- this NOT
//loadDoc("https://www.google.de", myCallback); <-- this WORKS
/*
Content Security Policy: Ignoring “'unsafe-inline'” within script-src: ‘strict-dynamic’ specified (unknown)
Content Security Policy: Ignoring “https:” within script-src: ‘strict-dynamic’ specified (unknown)
Content Security Policy: Ignoring “http:” within script-src: ‘strict-dynamic’ specified
*/
function loadDoc(url, cFunction) {
var xhttp;
xhttp=new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
cFunction(this);
}
};
xhttp.open("GET", url, true);
xhttp.send();
}
function myCallback(xhttp) {
alert("I'm alive from my local server");
}
(大)问题是我发现 "Content Security Policy" 不允许我调用其他域,即使我在自己的上下文中(我的浏览器,FF 53)也是如此。
现在看来,至少对于我需要的 GET 请求来说,这很容易被欺骗,方法是在 DOM 中插入一个脚本,就像这样
AJAX cross domain call
尤其是 Rob W
这位伟大的 postInsert code into the page context using a content script
所以我这样试了,还是不行。
// var actualCode = ['/* Code here. Example: */' + 'alert(0);',
// '// Beware! This array have to be joined',
// '// using a newline. Otherwise, missing semicolons',
// '// or single-line comments (//) will mess up your',
// '// code ----->'].join('\n');
var script = document.createElement('script');
script.src = "http://localhost/index.php";
script.type = "text/javascript";
document.appendChild(script);
// script.textContent = actualCode;
// (document.head||document.documentElement).appendChild(script);
// script.remove();
安全性不是问题,因为我将只使用本地主机。 我在这里想念什么?
已编辑
这些是 Firefox 调试器显示的错误
Blocked loading mixed active content “http://localhost/index.php”[Learn More] axtest.js:16
Content Security Policy: Ignoring “'unsafe-inline'” within script-src: ‘strict-dynamic’ specified (unknown)
Content Security Policy: Ignoring “https:” within script-src: ‘strict-dynamic’ specified (unknown)
Content Security Policy: Ignoring “http:” within script-src: ‘strict-dynamic’ specified
将其附加到 body 或 head 元素,而不是根元素 document
:
document.body.appendChild(script);
混合活动内容错误是由于通过 https(SSL) 加载初始页面然后尝试加载 http(不安全)URL。要么在没有 https 的情况下加载页面,要么在您调用的 URL 上设置 https。
尽管我已经接受了一个答案,但我找到了一个非常适合我的情况的简单解决方案。 都是本地浏览器安全策略,无需注入任何JS代码。
首先,插件的 manifest.json 必须用这个更新
"permissions": [
"history",
"browsingData",
"tabs",
"<all_urls>",
"http://localhost/*",
"storage"
]
其次(感谢@Quentin)需要重新配置本地浏览器策略。通过在 about:config 菜单
中禁用 security.csp.enable 来关闭整个浏览器的 CSP