本ドキュメントは「実装済みの対策」と「今後対応すべき項目(既知の課題)」を区別して記述する。 ドキュメントとコードを乖離させないため、未実装のものは正直に未実装と記す。
- GASデプロイURLは
config.jsに分離し、.gitignoreで除外 - 配布用テンプレートとして
config.example.jsを提供 config.jsが未配置の場合、起動時に明示的なエラーで停止する
- 確認画面(
generateConfirmationContent)はDOM API +textContentで組み立て、ユーザ入力をinnerHTMLに直挿しない - Content-Security-Policy(CSP)を
index.htmlの meta タグで適用default-src 'self'をベースに、GAS連携と外部フォントのみ許可frame-ancestors 'self'、object-src 'none'、base-uri 'self'で各種サイドチャネルを抑止
- 必須項目・メール形式・台数下限・参加人数上限をフロントで検証
⚠️ GAS側でも同等の検証を必ず実施すること(クライアント検証はUX用)
- JSONP の使用:
fetchWithJsonpでレスポンスを<script>実行している。GAS側でAccess-Control-Allow-Originを設定し、fetch+ JSON 応答に置換する - GAS側の入力検証・レート制限: GAS の
doPost/doGet側に同等の検証と、IPまたはセッション単位のレート制限を実装する - postMessage の targetOrigin:
window.parent.postMessage(..., '*')を埋め込み許可ドメインに固定する
- ログ最適化:
console.logで API レスポンス全体を出力している箇所がある。本番では DEBUG フラグで抑止する - プライバシーポリシー: 氏名・メールを収集する以上、独立したページで利用目的・保存期間・連絡先を明示する
- APIキー、GASデプロイURL、サービスアカウントJSON等はコードに直書きしない
- ローカル設定は
config.js(gitignore済) または環境変数で扱う - エラーログ・スクリーンショット・LLMへの質問文に貼り付けない(記事「シークレットと鍵を、コードに書くな」参照)
- GAS のデプロイURLが漏れたら、Apps Scriptで再デプロイし旧URLを無効化する
- 緊急度が高い場合: GitHubのSecurity Advisoryを使用
- 一般的な問題: Issuesで報告
- 詳細を公開せず、まず開発チームに報告
-
config.jsが.gitignoreに含まれていること -
config.jsがリポジトリに含まれていないこと(git ls-files config.jsで何も返らない) -
script.js内に GAS デプロイURL のリテラルが残っていないこと - CSP の meta タグが
index.htmlに存在し、想定通り効いていること - GAS 側で必須項目・人数上限・メール形式の検証を行っていること
- HTTPS 経由でのみ配信していること
最終更新: 2026年04月28日 バージョン: 1.1.0