在<URL>中阻止脚本执行.因为文档的框架是沙箱,并且未设置"allow-scripts"权限

Ven*_*kat 39 javascript google-chrome jenkins angularjs

我知道如果我们在HTML中使用iFrame,我们就要对它进行沙盒处理并添加'allow-scripts'权限.

但我的问题是我的纯Angular JS应用程序中根本没有iFrame.当我在我的本地机器上运行它时工作正常.

当我将其部署到我的服务器时,Chrome会显示此错误消息以及以下错误:

拒绝加载样式'bootstrap.min.css',因为它违反了以下内容安全策略指令:"style-src'self'".

在'dashboard.html'中阻止了脚本执行,因为文档的框架是沙箱并且未设置'allow-scripts'权限.

我没有从第三方网站或其他地方调用该页面,这可能会注入我的来源并使其显示在iframe中.我检查了代码,我可以确认根本没有iframe.

顺便说一下,我使用的是旧版Chrome(26)和Firefox(10)[组织限制].这也发生在IE11上(虽然没有显示错误信息)页面没有加载.

可能是什么导致了这个?我在这里错过了什么吗?任何指针都将非常感激.

下面是我正在尝试做的快照...琐碎的部分修剪出来..

<html lang="en" ng-app="dashboard">
   <head>
      <title>Dashboard</title>
      <link href="css/bootstrap.min.css" rel="stylesheet">
      <script src="js/jquery.min.js"></script>
      <script src="js/angular.min.js"></script>
      <script src="js/ui-bootstrap-tpls-0.6.0.js"></script>
      <script src="js/bootstrap.min.js"></script>
      <script src="js/notifications.js"></script>
      <style>
         body { background-color: #F3F3F4; color: #676a6c; font-size: 13px;}
      </style>
      <script>
         var dashboardApp = angular.module('dashboard', ['ui.bootstrap', 'notificationHelper']);

         Type = {
            APP : 0, CTL : 1
         }


         function DashboardCtrl($scope, $location, $timeout, $http, $log, $q) {
            $scope.environments = [ { ... }];
            $scope.columns = [ { ... } ];

             $scope.Type = window.Type;
            $scope.applications = [{ ... }];

            $scope.selectedEnv = null;

            var resetModel = function(applications) {
                applications.forEach(function(app) {
                     var hosts=$scope.findHosts(app, $scope.selectedEnv);
                     if(hosts){
                         hosts.forEach(function(host){
                             $scope.initStatus(app.status,host);
                         });
                     }
                });
            };

            var timeoutPromise = null;

             $scope.initStatus = function (status,host) {
                 status[host]=[{
                     ...
                 }];

             };             
         }

      </script>
   </head>
   <body ng-controller="DashboardCtrl">
      <div class="request-notifications" ng-notifications></div>
      <div>
         <tabset>
            <tab ng-repeat="env in environments" heading="{{env.name}}" select="set(env)" active="env.tab_active">
               <div class="col-md-6" ng-repeat="column in columns" ng-class="{'vertical-seperator':$first}">
                  <div class="panel" ng-class="{'first-child':$first}">
                     <div class="panel-heading">
                        <h3>{{column.column}}</h3>
                     </div>
                     <div class="panel-body">
                        <div class="frontends" ng-repeat="layer in column.layers">
                           <h4>{{layer.name}}</h4>
                           <div class="category" ng-repeat="category in layer.categories" ng-class="category.css">
                              <div class="category-heading">
                                 <h4>{{category.name}}</h4>
                              </div>
                              <div class="category-body group" ng-repeat="group in category.groups">
                                 <div ng-if="!env[group.host]">
                                    <h4>{{group.name}}</h4>
                                    <span class="label label-danger">Not deployed</span>
                                 </div>
                                 <div ng-repeat="host in env[group.host]">
                                    <div class="group-info">
                                       <div class="group-name">{{group.name}}</div>
                                       <div class="group-node"><strong>Node : </strong>{{host}}</div>
                                    </div>
                                    <table class="table table-striped">
                                       <thead>
                                          <tr>
                                             ...
                                          </tr>
                                       </thead>
                                       <tbody>
                                          <tr class="testStatusPage" ng-repeat="app in apps | filter: { column: column.column, layer: layer.name, category: category.name, group: group.name } : true">
                                             <!-- Application Home Links -->
                                             <td class="user-link" ng-if="app.type === Type.A || app.type === Type.A1 || app.type === Type.B || app.type === Type.B1 || app.type === Type.C"><a href="{{app.link}}">{{app.text}}</a></td>                                                                                          <td ng-if="app.status[host].statusCode == 0" class="result statusResult"><span class="label label-success">Success</span></td>
                                             <td ng-if="app.status[svr].status != null && app.status[host].status != 0" class="result statusResult"><span class="label label-danger">{{app.status[host].error}}</span></td>
                                          </tr>
                                       </tbody>
                                    </table>
                                 </div>
                              </div>
                           </div>
                        </div>
                     </div>
                  </div>
               </div>
            </tab>
         </tabset>
      </div>
   </body>
</html>
Run Code Online (Sandbox Code Playgroud)

Ven*_*kat 48

我们在Jenkins userContent目录中使用了这个内容HTML.我们最近升级到最新的Jenkins 1.625 LTS版本,似乎他们引入了新的内容安全策略,它在响​​应标题中添加了以下标题,浏览器只是拒绝执行样式表/ Javascripts之类的任何内容.

X-Content-Security-Policy: sandbox; default-src 'none'; img-src 'self'; style-src 'self';
Run Code Online (Sandbox Code Playgroud)

为了克服它,我们必须通过重置Jenkins中的以下属性来删除此标头.

System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "")
Run Code Online (Sandbox Code Playgroud)

升级到Jenkins 1.625并使用userContent文件夹的用户可能会受到此更改的影响.

有关更多信息,请参阅https://wiki.jenkins-ci.org/display/JENKINS/Configuring+Content+Security+Policy

  • 它不是来自官方jenkins网站,而是来自soneone的回答,如下面来自Nakilon的评论.我发现root导致的是Chrome浏览器需要重新启动并完全清除会话,然后你可以在jenkins中显示html页面,你回答很棒. (2认同)

Noa*_*nos 26

HTML Publisher插件也有同样的问题.

根据Jenkins的新内容安全策略,您可以通过设置来绕过它:

hudson.model.DirectoryBrowserSupport.CSP = script-src'unsafe-inline';

更新: 出于某种原因,在Jenkins 2.x上,为了完全显示外部HTML页面,我不得不再次更新参数,使用空的CSP值而不是script-src'unsafe-inline:

-Dhudson.model.DirectoryBrowserSupport.CSP =

在Windows上,Jenkins主目录中有一个jenkins.xml,您可以在其中设置全局JVM选项,例如Jenkins系统属性.只需在arguments标签下添加:

<arguments> -Xrs -Xmx256m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle "-Dhudson.model.DirectoryBrowserSupport.CSP= " -jar "%BASE%\jenkins.war" --httpPort=8080 </arguments>

对于大多数Linux发行版,您可以在文件中修改JENKINS_ARGS:

/ etc/default/jenkins(或jenkins-oc)

对于CentOS,修改文件中的JENKINS_JAVA_OPTIONS:

/ etc/sysconfig/jenkins(或jenkins-oc)

请参阅"内容安全策略参考"中的更多示例:http: //content-security-policy.com/

  • 全球MAVEN_OPTS用于将争论传递给maven而不是Jenkins.所以它很自然不会起作用.相反,你应该从管理Jenkins链接下的Jenkins Scripts控制台设置它,并在那里设置属性:System.setProperty("hudson.model.DirectoryBrowserSupport.CSP","") (2认同)
  • @Venkat - 在Jenkins Scripts控制台中运行System.setProperty()仅适用于当前的Jenkins会话,因此您必须在下次Jenkins重启后再次运行它!而在Jenkins Service Java参数中设置它将使其全局化. (2认同)

Ron*_*nak 18

您需要按照以下步骤解决问题:

  1. 打开Jenkin主页.
  2. 转到管理Jenkins.
  3. 现在转到脚本控制台.
  4. 并在该控制台粘贴下面的语句,然后单击运行. System.setProperty("hudson.model.DirectoryBrowserSupport.CSP","")
  5. 之后它将加载css和js.

注意:执行上述步骤后,如果仍然没有加载css和js,则清除浏览器缓存和cookie并刷新页面.

  • (清除 CSP 属性后)对我来说,我需要重新运行测试,然后加载 css 和脚本。 (2认同)

Nak*_*lon 9

对于在Ubuntu上托管的Jenkins:

  1. /etc/default/jenkins

    JAVA_ARGS="${JAVA_ARGS} -Dhudson.model.DirectoryBrowserSupport.CSP=\"\" "
    
    Run Code Online (Sandbox Code Playgroud)
  2. 访问 http://<your jenkins hostname>/safeRestart

(关于这个和其他选项:https://wiki.jenkins.io/display/JENKINS/Features+controlled+by+system+properties)

UPD:这次当我这样做时,访问/ safeRestart是不够的.我必须这样做sudo service jenkins restart.