So, in about 1 hour my extensions failed hard.
I was doing my extension and it was doing what I pretended. I made some changes, and as I didnt liked I deleted them, and now my extension is throwing error:
Refused to apply inline style because it violates the following Content Security Policy directive: "default-src 'self'". Note that 'style-src' was not explicitly set, so 'default-src' is used as a fallback.
What causes this error?
I made my changes in:
popup.html
<!DOCTYPE html> <html ng-app="PinIt" ng-csp> <head> <link rel="stylesheet" href="css/popup.css"> <script src="js/lib/jquery-1.8.2.min.js"></script> <script src="js/lib/angular.min.js"></script> <script src="js/app/app.js"></script> <script src="js/app/popup.js"></script> </head> <body id="popup"> <header> <h1>PinIt</h1> </header> <div ng-controller="PageController"> <div>{{message}}</div> <h2>Page:</h2> <div id="elem">{{title}}</div> <div>{{url}}</div> <h2>Imagens:</h2> <ul> <li ng-repeat="pageInfo in pageInfos" style="list-style: none"> <div class="imgplusshare"> <img src={{pageInfo}} class="imagemPopup"/> <ul class="imas"> <li id="liFacebook" ng-click="fbshare(pageInfo)"> <span> <img src="facebook_16.png"/>Facebook </span> </li> <li id="liTwitter" ng-click="twshare(pageInfo)"> <span> <img src="twitter-bird-16x16.png"/>Twitter </span> </li> <li id="liGooglePlus" ng-click="gpshare(pageInfo)"> <span><img src="gplus-16.png"/>Google+</span> </li> <li id="liEmail" ng-click="mailshare(pageInfo)"> <span><img src="mail_icon_16.png"/>Email</span> </li> <hr> </ul> </div> </li> </ul> </div> </body> </html>
popup.js
myApp.service('pageInfoService', function() { this.getInfo = function(callback) { var model = {}; chrome.tabs.query({'active': true}, function (tabs) { if (tabs.length > 0) { model.title = tabs[0].title; model.url = tabs[0].url; chrome.tabs.sendMessage(tabs[0].id, { 'action': 'PageInfo' }, function (response) { model.pageInfos = response; callback(model); }); } }); }; }); myApp.controller("PageController", function ($scope, pageInfoService) { pageInfoService.getInfo(function (info) { $scope.title = info.title; $scope.url = info.url; $scope.pageInfos = info.pageInfos; $scope.fbshare = function($src) { chrome.windows.create({url:"http://www.facebook.com/sharer/sharer.php?u="+$src}); }; $scope.twshare = function($src) { chrome.windows.create({url:"https://twitter.com/intent/tweet?url="+$src}); }; $scope.gpshare = function($src) { chrome.windows.create({url:"https://plus.google.com/share?url="+$src}); }; $scope.mailshare = function($src) { chrome.windows.create({url:"mailto:?subject=Imagem Partilhada por PinIt&body=<img src=\""+$src+"\"\\\>"}); }; $scope.$apply(); }); });
Here is my manifest file:
{ "name": "PinIt", "version": "1.0", "manifest_version": 2, "description": "Pin It", "icons": { "128": "icon128.png" }, "browser_action": { "default_icon": "img/defaultIcon19x19.png", "default_popup": "popup.html", "default_title": "PinIt" }, "content_scripts": [ { "js": [ "js/lib/jquery-1.8.2.min.js", "js/app/content.js", "js/jquery-ui-1.10.3.custom.js" ], "matches": [ "*://*/*" ], "run_at": "document_start" } ], "minimum_chrome_version": "18", "permissions": [ "http://*/*", "https://*/*", "unlimitedStorage", "contextMenus", "cookies", "tabs", "notifications" ], "content_security_policy": "default-src 'self'" }
any sugestion?
Allow Inline Style Attribute using a hashEither the 'unsafe-inline' keyword, a hash ('sha256-nMxMqdZhkHxz5vAuW/PAoLvECzzsmeAxD/BNwG15HuA='), or a nonce ('nonce-...') is required to enable inline execution.
The Content Security Policy (CSP) prevents cross-site scripting attacks by blocking inline execution of scripts and style sheets. To solve this, move all inline scripts (e.g. onclick=[JS code]) and styles into external files. adding the hash or nonce of the inline script to your CSP header.
'unsafe-inline' allows the execution of unsafe in-page scripts and event handlers that increase the chances of XSS (Cross-Site Scripting).
Allowing inline styles makes you susceptible to a the "other XSS". Cross Site Styling attacks. The idea here is that any places where a user can inject a style attribute into your document they can modify the appearance of your page any way they want.
You can also relax your CSP for styles by adding style-src 'self' 'unsafe-inline';
"content_security_policy": "default-src 'self' style-src 'self' 'unsafe-inline';"
This will allow you to keep using inline style in your extension.
As others have pointed out, this is not recommended, and you should put all your CSS in a dedicated file. See the OWASP explanation on why CSS can be a vector for attacks (kudos to @ KayakinKoder for the link).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With