拒绝 运行 JavaScript URL 因为它违反了以下内容安全策略指令
Refused to run the JavaScript URL because it violates the following Content Security Policy directive
我正在尝试 运行 Linkedin 页面的 chrome-console 中的 js 脚本。
该脚本需要获取一个数组并下载该数组的 .csv 文件。
当我在 google.com 或任何其他网站上 运行 它时,它工作正常。但是当我在 Linkedin 上 运行 时,我得到了这个错误:
Refused to run the JavaScript URL because it violates the following Content Security Policy directive:
"script-src 'report-sample' 'sha256-6gLjSWp3GRKZCUFvRX5aGHtECD1wVRgJOJp7r0ZQjV0=' 'unsafe-inline' static.licdn.com s.c.lnkd.licdn.com static-fstl.licdn.com static-src.linkedin.com
https://www.linkedin.com/voyager/service-worker-push.js
https://platform.linkedin.com/js/analytics.js static-exp1.licdn.com static-exp2.licdn.com s.c.exp1.licdn.com s.c.exp2.licdn.com static-lcdn.licdn.com s.c.lcdn.licdn.com https://www.linkedin.com/sc/ https://www.linkedin.com/scds/ https://qprod.www.linkedin.com/sc/ https://www.linkedin.com/sw.js https://www.linkedin.com/voyager/abp-detection.js https://platform.linkedin.com/litms/utag/ https://platform.linkedin.com/litms/vendor/"
.
Note that 'unsafe-inline'
is ignored if either a hash or nonce value is present in the source list.
这就是我要尝试的代码 运行:
rowsso = [["#: ", "Name: ", "Title: "], ["5","hi", "five"]];
let csvContentss = "data:text/csv;charset=utf-8,";
rowsso.forEach(function(rowArray){
let row = rowArray.join(",");
csvContentss += row + "\r\n";
});
var encodedUri = encodeURI(csvContentss);
var link = document.createElement("a");
link.setAttribute("href", encodedUri);
link.setAttribute("download", "my_data.csv");
document.body.appendChild(link); // Required for FF
link.click();
我试图寻找类似的案例,但找不到解决问题的方法。
当您在特定网站的控制台中执行某些脚本时,您会在该网站的上下文中执行它。
在 linkedin 网站上,某些标准方法可能有一些覆盖,例如 appendChild 的覆盖,他们已经重新实现了此类方法以进行额外检查,以确保有人不会从外部执行不需要的脚本。
此外,linkedin 可能有监听 DOM 变化的脚本,如果你想在 DOM 中放置一些奇怪的东西,他们可能会阻止。
更新:
我看到
的执行有问题
link.click()
在 linkedin 页面上,因此他们以某种方式阻止以编程方式在具有 csv 格式的 link 元素上使用点击...
更新:
我看到 linkedin 使用:内容安全策略
请在此处阅读更多相关信息:https://content-security-policy.com/
所以他们可能不允许在浏览器中即时生成 csv。
使用以下代码使用不违反 CSP 的不同方法解决了问题:
此函数接收二维数组和 return 适当格式的字符串,以便稍后创建 csv 文件:
function arrayToCSV (twoDiArray) {
var csvRows = [];
for (var i = 0; i < twoDiArray.length; ++i) {
for (var j = 0; j < twoDiArray[i].length; ++j) {
twoDiArray[i][j] = '\"' + twoDiArray[i][j] + '\"'; // Handle elements that contain commas
}
csvRows.push(twoDiArray[i].join(','));
}
var csvString = csvRows.join('\r\n');
return csvString;
}
使用 return 字符串,我们将其发送到此函数:
function downloadString(text, fileType, fileName) {
var blob = new Blob([text], { type: fileType });
var a = document.createElement('a');
a.download = fileName;
a.href = URL.createObjectURL(blob);
a.dataset.downloadurl = [fileType, a.download, a.href].join(',');
a.style.display = "none";
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
setTimeout(function() { URL.revokeObjectURL(a.href); }, 1500);
}
所以在主体中看起来像这样:
rowsso = [["#: ", "Name: ", "Title: "], ["5","hi", "five"]];
twoDArrStr = arrayToCSV(rowsso);
downloadString(twoDArrStr, "csv" , "csvFile.csv");
效果很好,但是,如果有人能更好地向我解释这是什么原因,而另一个却不起作用,我会很高兴。
我正在尝试 运行 Linkedin 页面的 chrome-console 中的 js 脚本。 该脚本需要获取一个数组并下载该数组的 .csv 文件。 当我在 google.com 或任何其他网站上 运行 它时,它工作正常。但是当我在 Linkedin 上 运行 时,我得到了这个错误:
Refused to run the JavaScript URL because it violates the following Content Security Policy directive:
"script-src 'report-sample' 'sha256-6gLjSWp3GRKZCUFvRX5aGHtECD1wVRgJOJp7r0ZQjV0=' 'unsafe-inline' static.licdn.com s.c.lnkd.licdn.com static-fstl.licdn.com static-src.linkedin.com https://www.linkedin.com/voyager/service-worker-push.js https://platform.linkedin.com/js/analytics.js static-exp1.licdn.com static-exp2.licdn.com s.c.exp1.licdn.com s.c.exp2.licdn.com static-lcdn.licdn.com s.c.lcdn.licdn.com https://www.linkedin.com/sc/ https://www.linkedin.com/scds/ https://qprod.www.linkedin.com/sc/ https://www.linkedin.com/sw.js https://www.linkedin.com/voyager/abp-detection.js https://platform.linkedin.com/litms/utag/ https://platform.linkedin.com/litms/vendor/"
.
Note that'unsafe-inline'
is ignored if either a hash or nonce value is present in the source list.
这就是我要尝试的代码 运行:
rowsso = [["#: ", "Name: ", "Title: "], ["5","hi", "five"]];
let csvContentss = "data:text/csv;charset=utf-8,";
rowsso.forEach(function(rowArray){
let row = rowArray.join(",");
csvContentss += row + "\r\n";
});
var encodedUri = encodeURI(csvContentss);
var link = document.createElement("a");
link.setAttribute("href", encodedUri);
link.setAttribute("download", "my_data.csv");
document.body.appendChild(link); // Required for FF
link.click();
我试图寻找类似的案例,但找不到解决问题的方法。
当您在特定网站的控制台中执行某些脚本时,您会在该网站的上下文中执行它。
在 linkedin 网站上,某些标准方法可能有一些覆盖,例如 appendChild 的覆盖,他们已经重新实现了此类方法以进行额外检查,以确保有人不会从外部执行不需要的脚本。
此外,linkedin 可能有监听 DOM 变化的脚本,如果你想在 DOM 中放置一些奇怪的东西,他们可能会阻止。
更新: 我看到
的执行有问题link.click()
在 linkedin 页面上,因此他们以某种方式阻止以编程方式在具有 csv 格式的 link 元素上使用点击...
更新:
我看到 linkedin 使用:内容安全策略 请在此处阅读更多相关信息:https://content-security-policy.com/
所以他们可能不允许在浏览器中即时生成 csv。
使用以下代码使用不违反 CSP 的不同方法解决了问题:
此函数接收二维数组和 return 适当格式的字符串,以便稍后创建 csv 文件:
function arrayToCSV (twoDiArray) {
var csvRows = [];
for (var i = 0; i < twoDiArray.length; ++i) {
for (var j = 0; j < twoDiArray[i].length; ++j) {
twoDiArray[i][j] = '\"' + twoDiArray[i][j] + '\"'; // Handle elements that contain commas
}
csvRows.push(twoDiArray[i].join(','));
}
var csvString = csvRows.join('\r\n');
return csvString;
}
使用 return 字符串,我们将其发送到此函数:
function downloadString(text, fileType, fileName) {
var blob = new Blob([text], { type: fileType });
var a = document.createElement('a');
a.download = fileName;
a.href = URL.createObjectURL(blob);
a.dataset.downloadurl = [fileType, a.download, a.href].join(',');
a.style.display = "none";
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
setTimeout(function() { URL.revokeObjectURL(a.href); }, 1500);
}
所以在主体中看起来像这样:
rowsso = [["#: ", "Name: ", "Title: "], ["5","hi", "five"]];
twoDArrStr = arrayToCSV(rowsso);
downloadString(twoDArrStr, "csv" , "csvFile.csv");
效果很好,但是,如果有人能更好地向我解释这是什么原因,而另一个却不起作用,我会很高兴。