HTMLでiFrameを使用する場合、サンドボックス化し、 'allow-scripts'アクセス許可をtrueに追加する必要があることを認識しています。
しかし、私の問題は、純粋なAngular JSアプリケーションにiFrameがまったくないことです。ローカルマシンで実行すると、正常に動作します。
サーバーにデプロイすると、Chromeはこのエラーメッセージと以下のエラーを表示します。
スタイル 'bootstrap.min.css'のロードを拒否しました。これは、次のコンテンツセキュリティポリシーディレクティブに違反しているためです: "style-src 'self'"。
ドキュメントのフレームがサンドボックス化され、「allow-scripts」権限が設定されていないため、「dashboard.html」でのスクリプト実行がブロックされました。
サードパーティのサイトや、ソースを挿入して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>
Jenkins userContentディレクトリでこのコンテンツHTMLを使用していました。最近、最新のJenkins 1.625 LTSバージョンにアップグレードし、応答ヘッダーに以下のヘッダーを追加する新しいコンテンツセキュリティポリシーを導入したようです。ブラウザーは、スタイルシート/ Javascriptなどの実行を拒否します。
X-Content-Security-Policy: sandbox; default-src 'none'; img-src 'self'; style-src 'self';
それを乗り越えるには、Jenkinsで以下のプロパティをリセットしてこのヘッダーを削除する必要がありました。
System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "")
Jenkins 1.625にアップグレードしてuserContentフォルダーを使用するユーザーは、この変更の影響を受ける可能性があります。
詳細については、 https://wiki.jenkins-ci.org/display/JENKINS/Configuring+Content+Security+Policy を参照してください
HTML Publisherプラグイン で同じ問題が発生しました。
Jenkinsの新しい コンテンツセキュリティポリシー によると、以下を設定することでバイパスできます。
hudson.model.DirectoryBrowserSupport.CSP = script-src 'unsafe-inline';
UPDATE:何らかの理由でJenkins 2.xでは、代わりに空のCSP値で引数を再度更新する必要がありました script-src 'unsafe-inline、外部HTMLページを完全に表示するには:
-Dhudson.model.DirectoryBrowserSupport.CSP =
Windowsでは、Jenkinsホームディレクトリにjenkins.xmlがあり、JenkinsシステムプロパティなどのグローバルJVMオプションを設定できます。 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/
以下の解決策の手順に従う必要があります。
注:上記の手順を実行した後、まだcssとjsをロードしていない場合は、ブラウザーのキャッシュとCookieをクリアしてページを更新します。
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
。
上記の回答は、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' *;\""
詳細 こちら
Amazon Linuxの場合は、/etc/sysconfig/jenkins
変化する:
#JENKINS_ARGS="-Dhudson.model.DirectoryBrowserSupport.CSP=sandbox"
JENKINS_ARGS="-Dhudson.model.DirectoryBrowserSupport.CSP=\"\""