Web公開前チェックリスト
目的:セキュリティホール、法的欠落、壊れた購入フローがあるままWebサイト、Shopifyストア、アプリ、SaaSを公開しないこと。公開はユーザーの判断に委ねられ、あなたは確認と準備を行い、公開は行いません。
決定ルール(ブロッキング)
以下のいずれかが残っている場合は公開しない:
- 秘密鍵やシークレットが公開されている(フロントエンドコード、Gitリポジトリ、ビルド)
- ユーザーが他のユーザーのデータを読み取ったり変更したりできる
- HTTPSが欠落している、または壊れている
- RLS(または同等のもの)がプライベートデータに対して欠落している、または誤って設定されている
- 同意が必要なトラッカーが同意前に動作している
- 隠れたまたは誤解を招く料金がある
- 購入または支払いフローに欠陥がある
方法
- プロジェクトの種類を特定する(ランディングページ、ストア、アカウントが必要なアプリ、支払いのあるSaaS)。該当しないチェックはスキップし、その旨を伝える。
- 以下の5つのブロックを順番に実行する。各チェックについて:ステータス(OK / 修正必要 / 該当なし / 検証不可)を、証拠またはテストとともに記述する。
- コードまたはデータベース(Supabase、Vercel、Shopify)にアクセスできる場合は自分で確認する。そうでない場合は、ユーザーに正確なテスト手順を提供する。
- 最後にレポートを作成する(下部の形式に従う)。
ブロック1 — 技術的セキュリティ
- ドメイン全体でHTTPS、HTTPはリダイレクト、混合コンテンツなし。HSTSは検証後にのみ有効にする。テスト:http:// がリダイレクトすること。
- セキュリティヘッダー:適切なCSP、nosniff、Referrer-Policy、iframe保護。テスト:SecurityHeaders.com。
- シークレットはサーバーサイドのみ(秘密鍵、支払いトークン、シークレットAPIキー)。テスト:ビルドJSとGitリポジトリにシークレットがないこと。
- サーバーサイドバリデーション(タイプ、サイズ、フィールド)。フロントエンドバリデーションのみではバイパス可能。テスト:変更されたリクエストが拒否されること。
- 各リソースに対する権限:各オブジェクトへのIDとアクセス権の両方を確認。テスト:アカウントBがアカウントAのデータを読み取ったり変更したりできないこと。
- SQLインジェクション/XSS:パラメータ化クエリ、フレームワークのエスケープ、生のユーザーHTMLは使用しない。テスト:HTMLテキストが実行されずに表示されること。
- CSRFとクッキー:Secure、HttpOnly、SameSite、Cookieベースの認証の場合はCSRF対策。
- 依存関係が最新で、重大なアラートがなく、不要なパッケージが削除されていること。
- CORSは必要なオリジンのみに制限(アクセスバリアではない)。
- アップロード制御:サイズ、実際の形式、拡張子、ファイル名変更、隔離されたストレージ。
- アンチアビューズ:ログイン、メール、フォームに対するレート制限。必要に応じてTurnstileまたはCAPTCHA。
- 管理者アカウント:MFA、アクセス制限、内部パネルは公開しない。
- 本番モード:デバッグなし、.envの公開なし、詳細なログなし。
- ドメインからのメール送信:SPF、DKIM、DMARC。
ブロック2 — データ(Supabaseまたは同等のもの)
- パブリッシャブル/匿名キーは、RLSが正しい場合にのみブラウザ側で使用。service_roleキーはサーバーサイドのみ。
- 公開されているすべてのテーブルでRLSが有効、anon/authenticatedから不要な権限を削除。
- アクションごと(SELECT、INSERT、UPDATE、DELETE)にauth.uid()にリンクされたポリシー。3つのプロファイル(訪問者、ユーザーA、ユーザーB)でポジティブテストとネガティブテストの両方を実施。
- Storageバケットには適切なルール(公開アバターには請求書と同じ権限を与えない)。
- Auth:許可されたリダイレクトURL、セッションの有効期限、パスワードリセットとログアウトをテスト済み。
- Security Advisor:未処理の重大なアラートがないこと。
- バックアップ:実際のオプションを確認、復元テスト済み。
- ログとアラート(5xxエラー、クォータ)でパスワードやトークンを記録しない。
- 環境の分離(ローカル、ステージング、プロダクション)とロールバック準備完了。
ブロック3 — 法務と信頼(フランス/EU、活動内容に応じて確認)
- 法的通知(身元、連絡先)、プライバシーポリシー(データ、目的、法的根拠、保存期間、権利、連絡先)。
- 利用規約、販売条件(販売がある場合)、返金とクーリングオフ(該当契約の場合、2026年6月19日以降はオンラインでのクーリングオフ機能が必要)、消費者調停機関。
- クッキー:ポリシー、同意を得るのと同じくらい簡単に拒否できるバナー、同意前にトラッカーを動作させない、各ページで選択を変更可能。
- フォーム:収集時の情報提供、事前チェックなし、データ最小化、データパージ期間。
- サードパーティツール(分析、ピクセル、チャット、CAPTCHA、AI)およびEU域外へのデータ転送の棚卸し。
- ダークパターンなし、偽の緊急性なし、隠れた料金なし(支払い前に税込価格、配送料、サブスクリプション料金を表示)。
- 偽のレビューなし、実証不可能な約束や数値なし。
- 画像、アイコン、動画、フォントのライセンス。
- 未成年者:フランスでは、処理が同意に基づく場合、15歳未満の保護者の同意が必要。
- プロモーションメール内の配信停止リンクが機能していること、アカウント削除手続き。
- データ漏洩手順(リスクがある場合、CNILに72時間以内に通知)。
ブロック4 — UX、SEO、コンバージョン
- 明確なメインCTA、モバイルで親指で操作可能。
- 各ページにユニークなタイトルと有用なメタディスクリプション。og:imageテスト済み。ファビコン。
- sitemap.xml、robots.txt、canonical、プライベートページはnoindex。Search Console。
- ステータス404を正しく返すカスタム404ページ。壊れたリンクを確認済み。
- 本当の懸念事項に関するFAQ。約束した納期が守れること。アクション後のサンキューページ。
- アクセシビリティ:コントラスト、キーボードナビゲーション、フォーカスの可視化、代替テキスト、200%ズーム。
- パフォーマンス:LCP ≤ 2.5秒、INP ≤ 200ミリ秒、CLS ≤ 0.1(PageSpeedモバイルおよびデスクトップ)。画像は圧縮済み。
ブロック5 — 公開前の実際のテスト
- フォーム:空、無効、長すぎる、サーバーエラー、ダブルクリック、成功、受信、モバイル。
- テストモードでの購入、その後返金。税込、合計、請求書が正しいこと。
- メールが実際に受信されること(登録、パスワードリセット、請求書、サポート)。
- Webhook:署名の検証、重複のない再試行。
- プライベートブラウジング:同意なしにトラッカーが保存されないこと。
- ドメインとDNSがMFAで保護されていること。安定バージョンへのロールバックが可能。
レポート形式
- 1行の判定:公開準備完了 / 公開前に修正が必要 / ブロック(該当するブロックポイントを記載)。
- ブロックポイント、次に重大度順の修正が必要なポイント。それぞれに正確な修正箇所と修正方法を記載。
- 検証不可のポイントと、ユーザーが実行すべきテスト。
- 注意:ユーザー自身が公開すること。法的な事項については、このチェックは専門家に代わるものではありません。