拒绝应用内联样式,因为它违反了以下内容安全策略指令

Joã*_*rão 41 javascript google-chrome-extension content-security-policy

所以,在大约1小时内,我的扩展失败了.

我正在进行扩展,它正在做我假装的事情.我做了一些更改,因为我不喜欢我删除它们,现在我的扩展程序抛出了错误:

拒绝应用内联样式,因为它违反了以下内容安全策略指令:"default-src'self'".请注意,'style-src'未显式设置,因此'default-src'用作后备.

是什么导致这个错误?

我做了以下改动:

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>
Run Code Online (Sandbox Code Playgroud)

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


        });
    });
Run Code Online (Sandbox Code Playgroud)

这是我的清单文件:

{
    "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'"
}
Run Code Online (Sandbox Code Playgroud)

任何消化?

Mét*_*ule 44

您还可以通过添加来放松您的CSP风格 style-src 'self' 'unsafe-inline';

"content_security_policy": "default-src 'self' style-src 'self' 'unsafe-inline';" 
Run Code Online (Sandbox Code Playgroud)

这样您就可以在扩展程序中继续使用内联样式.

重要的提示

正如其他人所指出的那样,建议这样做,你应该将所有CSS放在一个专用文件中.请参阅OWASP解释为什么CSS可以成为攻击的载体(对于链接来说是@ KayakinKoder的荣誉).

  • 这个建议对开发人员有好处,但对用户不利.它为恶意软件编写者添加了额外的攻击媒介.CSP使跨站点攻击变得更加困难.使用它,不要打败它! (21认同)
  • 我到处都看到了这个.它到处都说"包含'不安全 - 内联'是不好的,但我还没有很好地解释为什么(特别是对于样式,而不是脚本),最好是一个例子. (5认同)
  • @JoshMc我有同样的问题,是的内联样式是不安全的,就像内联脚本一样不安全.OWASP示例:https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Revention_Cheat_Sheet#RULE_.234_-_CSS_Escape_And_Strictly_Validate_Before_Inserting_Untrusted_Data_into_HTML_Style_Property_Values (5认同)
  • 我不得不这样做,因为正如sowbug所说,允许不安全的内联对安全性有害.["如果攻击者可以注入直接包含某些恶意负载的脚本标记..浏览器没有机制可以将其与合法的内联脚本标记区分开来.CSP通过完全禁止内联脚本解决了这个问题:这是唯一的方法确定."](http://www.html5rocks.com/en/tutorials/security/content-security-policy/#inline-code-considered-harmful) (3认同)
  • @KayakinKoder否。不安全的样式甚至不像不安全的脚本那样不安全。没有现代的浏览器会执行通过样式加载的js。 (2认同)

sow*_*bug 17

正如错误消息所示,您有一个内联样式,CSP禁止.我list-style: none在HTML中看到至少一个().将该样式放在CSS文件中.

为了进一步解释,内容安全策略不允许内联CSS,因为它可能是危险的.来自内容安全政策简介:

"如果攻击者可以注入一个直接包含某些恶意有效负载的脚本标签,那么浏览器就没有机制将其与合法的内联脚本标签区分开来.CSP通过完全禁止内联脚本来解决这个问题:这是唯一的方法当然."

  • 这对我没有任何意义.对于内联_scripts_我理解它,但这个问题是关于内联_styles_.是否可以注入恶意内联样式? (7认同)
  • 这是搜索[恶意内联风格]的第一个结果:http://dontkry.com/posts/code/disable-inline-styles.html (2认同)
  • 该页面上的参数似乎无效。它使用非内联样式的示例来说明为什么您可能想要阻止内联样式。它提供的示例确实是用CSS可以做的邪恶的事情,但是为什么只阻止内联样式而不是例如所有CSS? (2认同)
  • @Trejkaz在dontkry页面上提到的样式*是*内联样式.在这种情况下,"内联"包含`<style>`元素,而不仅仅是`style =`属性;*non*-inline意味着在`head`中放置一个`link rel ="样式表"`元素.关键是它是对[XSS](https://en.wikipedia.org/wiki/Cross-site_scripting)的保护和保护,我们假设XSS攻击者可以向页面的"body"添加任何内容但是不能在`head`中添加`link rel ="样式表"`. (2认同)
  • 因为有人可以使用 css 将任何文本添加到您的网站。想一想:“:after{content:“你被黑了”,fontSize:666} (2认同)

小智 10

根据http://content-security-policy.com/最好的起点:

    default-src 'none'; 
    script-src 'self'; 
    connect-src 'self'; 
    img-src 'self'; 
    style-src 'self';
    font-src 'self';
Run Code Online (Sandbox Code Playgroud)

切勿内联样式或脚本,因为它会破坏 CSP 的目的。您可以使用样式表来设置样式属性,然后使用.js文件中的函数来更改样式属性(如果需要)。


san*_*rom 5

style另一种方法是通过DOM 节点上的属性使用 CSSOM(CSS 对象模型) 。

var myElem = document.querySelector('.my-selector');
myElem.style.color = 'blue';
Run Code Online (Sandbox Code Playgroud)

有关 CSSOM 的更多详细信息: https ://developer.mozilla.org/en-US/docs/Web/API/HTMLElement.style

正如其他人提到的,启用unsafe-linecss 是解决此问题的另一种方法。