2016-03-28 4 views
1

Я пытаюсь реализовать политику безопасности контента, чтобы включить выполнение встроенных обработчиков в chrome extension, используя sha-256 хэшей для каждого встроенного сценария события.Расширение Chrome CSP sha-256 hash для сценария встроенного события

Но я не могу получить эту работу: Я извлек все Внутристрочные и вычисленных хэшей, так что мой content_security_policy теперь выглядит следующим образом:

"content_security_policy": "script-src 'self' 'unsafe-eval' 'sha256-Zy8+Ft7FDcIkrTYgl2BKmEW5XD97XustxKPceyLSioQ=' 'sha256-YNkUpNj1B2/FuE2RmwQf40OIO5rH69xQbG5AAxwshrA=' 'sha256-Pmun4RTarna683hWYftYdXPERPfEVV5fB+qvqh3xnmg=' ... ... 'sha256-RoSxVuvjYKDbU5f+aUEw02rEM9e2Lp9Hz/+rxbp6OMw='; object-src 'self'"

, например, для onclick="w2ui['grid'].click('1', event);" я получаю sha256-Zy8+Ft7FDcIkrTYgl2BKmEW5XD97XustxKPceyLSioQ=

The docs state, что это поддерживаемый метод, но он по-прежнему бросает ошибки

Refused to execute inline event handler because it violates the following Content Security Policy directive: "script-src 'self' 'unsafe-eval' 'sha256-Zy8+Ft7FDcIkrTYgl2BKmEW5XD97XustxKPceyLSioQ=' 'sha256-YNkUpNj1B2/FuE2RmwQf40OIO5rH69xQbG5AAxwshrA=' 'sha256-Pmun4RTarna683hWYftYdXPERPfEVV5fB+qvqh3xnmg=' ... ... Either the 'unsafe-inline' keyword, a hash ('sha256-...'), or a nonce ('nonce-...') is required to enable inline execution.

Это известная ошибка, или я просто злоупотребляю концепцией?

+0

Chrome обычно показывает требуемое значение sha256, но вы только что указали ... в своем сообщении об ошибке. Разве Chrome вычислил то же значение хэша, как и вы? –

+0

no - chrome показывает буквально 'Либо ключевое слово 'unsafe-inline', либо hash ('sha256 -...'), либо nonce ('nonce -...') требуется для включения встроенного исполнения.' – grandrew

ответ

0

Ответ здесь кажется, что хром - по какой-либо причине - не поддерживает хеширование встроенных событий вообще; Я был в состоянии работать вокруг этого, предварительно оценивая все Внутристрочные используя 'unsafe-eval' разрешение:

var events = ["onclick", "onmouseover", "onmouseout", "onmousedown", 
"onmouseup", "onscroll", "oncontextmenu", "onmousewheel", "ondblclick"]; 
function vulcanize_inlines() { 
    for(var i=0;i<events.length;i++) { 
     var els = getAllElementsWithAttribute(events[i]); 
     for(var j=0;j<els.length;j++) { 
      var fun = eval("(function a(){"+els[j].getAttribute(events[i])+"})"); 
      els[j].removeAttribute(events[i]); 
      els[j][events[i]] = fun; 
     } 
    } 
} 

и добавив в .onload:

vulcanize_inlines(); 
var target = document.body; 
var observer = new MutationObserver(function(mutations) { 
    vulcanize_inlines(); 
}); 
var config = { /*attributes: true,*/ childList: true, 
    characterData: true, subtree: true }; 
observer.observe(target, config); 

getAllElementsWithAttribute Я из this answer

Смежные вопросы