我知道如果我们在HTML中使用iFrame,我们就要对它进行沙盒化处理。添加'allow-scripts'权限为true。
但我的问题是我的纯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>
答案 0 :(得分:47)
我们在Jenkins userContent目录中使用此内容HTML。我们最近升级到最新的Jenkins 1.625 LTS版本&amp;他们似乎已经引入了新的内容安全策略,该策略将以下标题添加到响应标题和&amp;浏览器只是拒绝执行样式表/ Javascripts之类的任何内容。
X-Content-Security-Policy: sandbox; default-src 'none'; img-src 'self'; style-src 'self';
为了克服它,我们不得不通过重置Jenkins中的以下属性来删除此标题。
System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "")
升级到Jenkins 1.625&amp;使用userContent文件夹可能会受到此更改的影响。
有关更多信息,请参阅https://wiki.jenkins-ci.org/display/JENKINS/Configuring+Content+Security+Policy
答案 1 :(得分:26)
HTML Publisher Plugin我遇到了同样的问题。
根据Jenkins新Content Security Policy的说法,你可以通过设置:
来绕过它hudson.model.DirectoryBrowserSupport.CSP = script-src&#39; unsafe-inline&#39;;
<强>更新强>
由于某些原因,Jenkins 2.x,我不得不再次使用空CSP值更新参数,而不是 script-src&#39; unsafe-inline ,以便完全显示外部HTML页面:
-Dhudson.model.DirectoryBrowserSupport.CSP =
在Windows上,Jenkins主目录中有 jenkins.xml ,您可以在其中设置全局JVM选项,例如Jenkins系统属性。只需将其添加到参数标记:
下 <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/
答案 2 :(得分:14)
您需要按照以下步骤解决问题:
注意:执行上述步骤后,如果仍未加载css和js,请清除浏览器缓存和cookie并刷新页面。
答案 3 :(得分:9)
对于在Ubuntu上托管的Jenkins:
付诸/etc/default/jenkins
JAVA_ARGS="${JAVA_ARGS} -Dhudson.model.DirectoryBrowserSupport.CSP=\"\" "
访问http://<your jenkins hostname>/safeRestart
(关于这个和其他选项:https://wiki.jenkins.io/display/JENKINS/Features+controlled+by+system+properties)
UPD:这次当我这样做时,访问/ safeRestart是不够的。我必须做sudo service jenkins restart
。
答案 4 :(得分:2)
上述答案在Ubuntu 16.04中与Jenkins 2.46.2无效。我不得不将/ etc / default / jenkins中的JAVA_ARGS更改为
JAVA_ARGS="-Djava.awt.headless=true -Dmail.smtp.starttls.enable=true -Dhudson.model.DirectoryBrowserSupport.CSP=\"sandbox allow-scripts; style-src 'unsafe-inline' *;script-src 'unsafe-inline' *;\""
更多信息here
答案 5 :(得分:0)
在/etc/sysconfig/jenkins
更改底部的Amazon Linux上:
#JENKINS_ARGS="-Dhudson.model.DirectoryBrowserSupport.CSP=sandbox"
JENKINS_ARGS="-Dhudson.model.DirectoryBrowserSupport.CSP=\"\""