admin管理员组文章数量:1134577
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: ".php?u=" + $src
});
};
$scope.twshare = function($src) {
chrome.windows.create({
url: "=" + $src
});
};
$scope.gpshare = function($src) {
chrome.windows.create({
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 suggestion?
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 suggestion?
Share Improve this question edited Nov 2, 2022 at 15:04 Alexander Nied 13.6k4 gold badges29 silver badges49 bronze badges asked Jul 20, 2013 at 21:21 João BeirãoJoão Beirão 1,6912 gold badges11 silver badges13 bronze badges 1- Here is a different but related issue: stackoverflow.com/questions/44495929/… – Intrepidis Commented Mar 12, 2020 at 9:20
8 Answers
Reset to default 152You 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.
Important note
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).
As the error message says, you have an inline style, which CSP prohibits. I see at least one (list-style: none
) in your HTML. Put that style in your CSS file instead.
To explain further, Content Security Policy does not allow inline CSS because it could be dangerous. From An Introduction to Content Security Policy:
"If an attacker can inject a script tag that directly contains some malicious payload .. the browser has no mechanism by which to distinguish it from a legitimate inline script tag. CSP solves this problem by banning inline script entirely: it’s the only way to be sure."
As per http://content-security-policy.com/ The best place to start:
default-src 'none';
script-src 'self';
connect-src 'self';
img-src 'self';
style-src 'self';
font-src 'self';
Never inline styles or scripts as it undermines the purpose of CSP. You can use a stylesheet to set a style property and then use a function in a .js
file to change the style property (if need be).
Another method is to use the CSSOM (CSS Object Model), via the style
property on a DOM node.
var myElem = document.querySelector('.my-selector');
myElem.style.color = 'blue';
More details on CSSOM: https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement.style
As mentioned by others, enabling unsafe-line
for css is another method to solve this.
Well, I think it is too late and many others have the solution so far.
But I hope this can Help:
I'm using react for an identity server so 'unsafe-inline' is not an option at all. If you look at your console and actually read the CSP docs, you might find that there are three options for solving the issue:
'unsafe-inline' as it says is unsafe if your project is using CSPs is for one reason and it is like throwing out the complete policy, will be the same to no have CSP policy at all
'sha-XXXCODE' this is good, safe but not optimal because there is a lot of manual work and every compilation the SHA might change so it will become easily a nightmare, use only when the script or style is unlikely to change and there are few references
Nonce. This is the winner!
Nonce works in the similar way as scripts
CSP HEADER ///csp stuff nonce-12331
<script nonce="12331">
//script content
</script>
Because the nonce in the csp is the same that the tag, the script will be executed
In the case of inline styles, the nonce also came in the form of attribute so the same rules apply.
so generate the nonce and put it on your inline scritps
If you are using webpack maybe you are using the style-loader
the following code will do the trick
module.exports = {
module: {
rules: [
{
test: /\.css$/i,
use: [
{
loader: 'style-loader',
options: {
attributes: {
nonce: '12345678',
},
},
},
'css-loader',
],
},
],
},
};
You can use in Content-security-policy add "img-src 'self' data:;" And Use outline CSS.Don't use Inline CSS.It's secure from attackers.
If you have some content where you can't avoid inline css for example REST API response
or user input. then in that case I have created the solution for in the following blog. where you can separate html and css from each other and try to add the nonce value from the html meta tag header(which will be generate at the time of build)
CSP handling for inline css using nonce
If I may ride this post, since I'm trying some of the solutions that were suggested here. I would highly like to avoid the "unsafe-inline" part, and would prefer using the nonse which i already set for each script tag, like this:
<script nonce="...."></script>.
On my case, I set the csp parameter to have:
style-src 'self' 'nonce-codexyzxyzxyz' https://example.com
The script is included with the nonce="..." part, and yet, the JS file is being blocked from changing the inline style of some div I have. I am trying to understand why? because after all, I told the CSP which nonce code (which the tag has) can "change", and which domain, but still blocks.
How can I make it work in the safe way?. After all, I assume we can add "whitelist" just as I did, but for some reason it does not work.
本文标签:
版权声明:本文标题:javascript - Refused to apply inline style because it violates the following Content Security Policy directive - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1736806619a1953716.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论