許可ソースからContent-Security-Policyヘッダーを作成
Content-Security-Policyヘッダーは、スクリプト、スタイル、画像、フォント、フレームなどのリソースをどこから読み込めるかをブラウザーへ指示します。この作成ツールは、構造化されたディレクティブ行を正しく区切られた1つのヘッダー値に変換し、未知の名前、重複、安全でない区切り文字、値の不足を検出します。デプロイツール、設定画面、セキュリティチェックリスト、アプリケーションテンプレートでポリシーを組み立てる際に、断片を手作業で連結したり、スペルミスのあるディレクティブを誤って受け入れたりせず、再現可能な結果を得るために役立ちます。
無料で実行
処理はブラウザ内で完結します。ファイルは送信されません。無料でご利用いただけます。
ディレクティブ行でポリシーを記述します
送信するポリシーディレクティブごとに1行を入力してください。各行にはディレクティブ名と、ソース式またはトークンの順序付きリストを指定します。たとえばdefault-srcは通常'self'から始まり、script-srcには特定のHTTPSコンテンツ配信ホストを追加できます。本ツールはディレクティブ名を小文字へ正規化し、各ソースの前後の空白を除去し、行とソースの順序を保ったまま、完成したディレクティブをセミコロンで連結します。フォールバックディレクティブを勝手に追加したり、ポリシーを暗黙に緩めたりすることはありません。省略と許可ではセキュリティ上の意味が大きく異なるためです。img-srcがなければdefault-srcへフォールバックする場合がありますが、余分なワイルドカードは意図以上の場所を許可する可能性があります。各ソースは1つのCSPトークンとして入力し、'self'や'none'などのキーワードの引用符は維持してください。data:のようなスキームは、アプリケーションで本当に必要な場合だけ指定します。返されるのはヘッダー名ではなく完全な値なので、サーバーまたはエッジ設定のContent-Security-Policyへ直接割り当てられます。
構造上の誤りを検証で検出します
本ツールは認識済みのCSPディレクティブ名だけを受け付け、未知の名前がある場合は入力エラーを返します。これにより、ブラウザーが無視してしまい、特定のリソース分類が想定より緩くなるおそれのあるスペルミスを検出できます。重複ディレクティブも拒否します。明示的な1行にまとめる方が監査しやすく、ブラウザーの予想外の処理を避けられるためです。個々のソーストークン内では、セミコロン、コンマ、改行、埋め込み空白を許可しません。生成ポリシーが分割または破損する可能性があるためです。大半のディレクティブには1つ以上のソースまたはトークンが必要です。一方、値を持たないupgrade-insecure-requestsとblock-all-mixed-contentは空のソースリストを指定し、名前だけを出力します。本ツールが検証するのは構造であり、ホストの信頼性やアプリケーションに十分な保護があるかどうかではありません。サイト取得、コード検査、nonce生成、ブラウザー互換性試験も行いません。実際の動作に照らして権限を確認し、障害が利用者へ影響する場合は、監視と段階的環境を用いて制限変更を導入してください。
結果を導入し、確認して保守します
返された値をContent-Security-Policyレスポンスヘッダーへコピーしてください。断片をミドルウェア、プロキシ規則、テンプレートへ分散させず、アプリケーションと一緒に設定として管理します。一元化されたリストなら追加内容をレビューでき、自動システムも毎回まったく同じ文字列を再生成できます。意図的な基準としてdefault-srcから始め、アプリケーションで別の動作が必要な場合にscript-src、style-src、img-src、connect-src、font-src、frame-src、object-src、frame-ancestorsなどの狭いディレクティブを追加します。広いワイルドカードより明示的なホストとスキームを優先してください。ハッシュやnonceを使う場合は、引用符を含む完全なCSPトークンを指定します。この機能は決定的で乱数を生成しないため、nonce自体は各リクエストを処理する層で作成してください。導入したレスポンスをブラウザーの開発者ツールで試し、強制前にレポート専用モードを検討します。レポートでブロックされた依存関係を確認できますが、無差別な許可ではなく正確な変更へつなげてください。設定変更のたびに再実行し、検証を配信工程に残します。APIリクエストは$0.002で、ブラウザー版も同じ純粋なアルゴリズムを使用します。
活用例
サーバー設定を生成します
確認済みのCSPディレクティブ一覧を、アプリケーションまたはプロキシ設定で使う正確なヘッダー値へ変換します。
デプロイフォームを検証します
ポリシーが本番環境へ届く前に、誤記されたディレクティブ名や不正なソーストークンを拒否します。
決定的な出力を維持します
バージョン管理された設定から、テスト、テンプレート、インフラ自動化向けの安定したCSPテキストを生成します。
よくある質問
料金はいくらですか?
APIリクエスト1件の料金は$0.002です。ブラウザー版は同じ決定的アルゴリズムでローカル実行されます。
ポリシーが安全かどうかも検査しますか?
いいえ。ディレクティブ名と出力構造を検証しますが、アプリケーションが信頼するソースはお客様が判断する必要があります。
キーワードの引用符は残す必要がありますか?
はい。'self'、'none'、'unsafe-inline'、'strict-dynamic'などを完全なCSPトークンとして入力してください。
nonceを生成できますか?
いいえ。nonceは予測不能で、レスポンスごとに生成する必要があります。特定のポリシーを組み立てる際は、準備済みの引用符付きnonceトークンを渡してください。
重複ディレクティブを拒否するのはなぜですか?
ディレクティブごとに1行なら明確で監査しやすく、名前が繰り返された場合のブラウザー動作へ依存せずに済むためです。
upgrade-insecure-requestsはどう追加しますか?
ソースリストを空にして、このディレクティブを追加してください。値のないディレクティブとして出力されます。
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/security/csp-header-build \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"directives":[{"name":"default-src","sources":["'\''self'\''"]},{"name":"script-src","sources":["'\''self'\''","https://cdn.example.com"]},{"name":"img-src","sources":["'\''self'\''","data:"]}]}'const res = await fetch("https://api.kit.forhosting.com/security/csp-header-build", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"directives": [
{
"name": "default-src",
"sources": [
"'self'"
]
},
{
"name": "script-src",
"sources": [
"'self'",
"https://cdn.example.com"
]
},
{
"name": "img-src",
"sources": [
"'self'",
"data:"
]
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/security/csp-header-build",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"directives": [
{
"name": "default-src",
"sources": [
"'self'"
]
},
{
"name": "script-src",
"sources": [
"'self'",
"https://cdn.example.com"
]
},
{
"name": "img-src",
"sources": [
"'self'",
"data:"
]
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/security/csp-header-build", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"directives":[{"name":"default-src","sources":["\'self\'"]},{"name":"script-src","sources":["\'self\'","https://cdn.example.com"]},{"name":"img-src","sources":["\'self\'","data:"]}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"directives":[{"name":"default-src","sources":["'self'"]},{"name":"script-src","sources":["'self'","https://cdn.example.com"]},{"name":"img-src","sources":["'self'","data:"]}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/security/csp-header-build", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"directives": [
{
"name": "default-src",
"sources": [
"'self'"
]
},
{
"name": "script-src",
"sources": [
"'self'",
"https://cdn.example.com"
]
},
{
"name": "img-src",
"sources": [
"'self'",
"data:"
]
}
]
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "security.csp_header_build",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |