Отказался запускать URL-адрес JavaScript, поскольку он нарушает следующую директиву Content Security Policy - PullRequest
0 голосов
/ 01 декабря 2018

Я пытаюсь запустить скрипт js в chrome-консоли страницы Linkedin.Сценарий должен взять массив и скачать .csv файл массива.Когда я запускаю его на google.com или любом другом веб-сайте, он работает нормально.Но когда я запустил его на Linkedin, я получил эту ошибку:

Отказался запускать URL-адрес JavaScript, поскольку он нарушает следующую директиву политики безопасности содержимого: "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/".
Обратите внимание, что 'unsafe-inline'игнорируется, если в списке источников присутствует хеш или одноразовое значение.

Вот код, который я пытаюсь запустить:

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(); 

Я пытался найти похожий случай,но не смог найти способ это исправить.

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Решил проблему, используя другой метод, который не нарушает CSP, используя следующий код:

Эта функция получает двумерный массив и возвращает строку в соответствующем формате для последующего создания файла 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;
}

С возвращаемой строкой мы отправляем ее в эту функцию:

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");

Работает хорошо,тем не менее, если кто-то может объяснить мне лучше, в чем причина того, что это на самом деле работает, а другой нет, я был бы счастлив.

0 голосов
/ 01 декабря 2018

Когда вы выполняете какой-либо сценарий в консоли для определенного веб-сайта, вы выполняете его в контексте этого веб-сайта.

На веб-сайте linkedin может быть несколько переопределений для некоторых стандартных методов, таких как переопределение для appendChild, и они переопределенытакие методы делают дополнительную проверку, чтобы удостовериться, что кто-то не будет выполнять ненужный скрипт извне.

Также у linkedin может быть скрипт, который прослушивает изменения DOM, и если вы хотите поместить что-то странное в DOM, они могут предотвратить это.

ОБНОВЛЕНИЕ: я вижу, что есть проблема с выполнением

link.click()

на странице linkedin, поэтому они каким-то образом не позволяют использовать щелчок программно на элементах ссылки в формате csv ...

ОБНОВЛЕНИЕ:

Я вижу, что использование кода: Политика безопасности контента. Узнайте больше об этом здесь: https://content -security-policy.com /

Так что ониможет не позволить генерировать CSV на лету в браузере.

...