セキュリティ

私たちのセキュリティモデルを一言で言えば、攻撃対象となるサーバー上のものが何もないということです。以下の内容はすべて DevTools から検証できます。

アーキテクチャ

ジェネレーターは Cloudflare Pages から配信される静的シングルページアプリケーションです:ユーザーアカウントなし、認証なし、生成フローのどこにもバックエンドのコードパスはありません。QR の生成、エンコード、スキャン、レンダリングのすべての処理はブラウザ内で完結します。一つの小さなサーバーレスエンドポイントがその脇にあり、隠さずここに明記します:/api/contact(お問い合わせフォーム。送信内容を Cloudflare D1 に保存し、私たちにメールで通知します)です。QR コードを作成している間は呼び出されません。URL 安全性チェッカーは check.qr.abundera.ai の別製品です。 QRコードの安全性を確認する

脅威モデル

ジェネレーターはユーザーデータの収集、保存、送信を行わないため(上記の2つのエンドポイントは、あなたが明示的に送信した内容のみを扱います)、最も一般的な Web アプリの脅威, 認証情報の窃取、データベース侵害、セッションハイジャック、サーバーサイドインジェクション, はジェネレーターには適用されません。残る攻撃対象は、オリジンから配信される静的アセットバンドル(HTML、CSS、JavaScript)です。私たちは以下を前提に設計しています:

コンテンツセキュリティポリシー, ディレクティブ別

以下のポリシーは、このページのビルド時にデプロイ済みの _headers ファイルから読み込まれるため、エッジが実際に送信する内容とずれることがありません。任意のリクエストのレスポンスヘッダーで確認してください。

Content-Security-Policy:
  default-src 'self';
  script-src 'self' https://abundera.ai 'wasm-unsafe-eval' https://challenges.cloudflare.com;
  worker-src 'self' blob:;
  style-src 'self' 'unsafe-inline' https://abundera.ai;
  font-src 'self';
  img-src 'self' data: blob: https:;
  connect-src 'self' https: https://challenges.cloudflare.com;
  frame-src 'self' https://challenges.cloudflare.com;
  frame-ancestors 'none';
  base-uri 'self';
  form-action 'self'

各ディレクティブが許可する操作と妥協点:

CSP にできないこと

CSP はブラウザがどこからコードを読み込むかを制限します。読み込まれたコードが何をするかまでは検証しません。もし私たちのオリジンが侵害された場合(脅威モデルの最初の項目です)、攻撃者のスクリプトは、上記の connect-src や img-src の許可を含め、私たちのコードと同じ権限で動作します。それに対する防御策は CSP よりも上流にあります:デプロイはスコープ付きトークンを持つ単一の Cloudflare アカウントを通じて行われ、アセットのファイル名はコンテンツハッシュ化されているため、ファイルがすり替えられれば、それを参照するすべての URL が変わり、サービスワーカーは同一オリジンの GET レスポンスのみをキャッシュします。マニフェストは、出荷された状態のサイトについて述べたものです。それは「どんな Web ページも決してデータをどこかに送れない」という主張ではなく、私たちとしては、この狭く検証可能な主張の範囲で評価していただきたいと考えています。

/bio/*(ユーザー提供アバター用に img-src を緩和)と /embed/*(意図的な埋め込み用に frame-ancestors を緩和)には異なる CSP ポリシーが適用されます。いずれも site/_headers に記載されています。

トランスポート + フレーミングヘッダー

サービスワーカー

サービスワーカー(site/sw.js)は同一オリジンのアセットのみをキャッシュします。フェッチハンドラーはクロスオリジンリクエストと GET 以外のメソッドを明示的に拒否します, ロジックは /sw.js で確認できます(追いやすい程度に非圧縮のまま出荷されています)。キャッシュへの書き込みは event.waitUntil() でラップされているため、ナビゲーション中に破棄されることはありません。

入力サニタイズ

ユーザー入力を受け付けるすべてのレンダリングパスは、それを信頼できないテキストとして扱います:

クロスオリジン画像フェッチ

ユーザーが vCard 写真またはロゴとして https: URL を貼り付けると、ブラウザは CORS と CSP の img-src 許可リストに従ってフェッチします。画像はキャンバスにレンダリングされます。ライブ DOM になることも、コードとして実行されることも、私たちのオリジンに到達することもありません, フェッチはブラウザ → リモート画像で行われ、結果はクライアントサイドで描画されます。リモート画像 URL を制御する攻撃者は、その URL が読み込まれたことを追跡できます(自分のサーバーのログ行)が、私たちのページから何かを持ち出すことはできません。

サブリソース整合性(SRI)

私たちが提供するすべての JavaScript と CSS は同一オリジンです。サードパーティのスクリプトやスタイルシートを読み込まないため、SRI ハッシュは適用されません。将来サードパーティのアセットを読み込む場合は、integrity 属性を付与し、このページにハッシュ更新プロセスを記載します。

脆弱性の報告

Abundera QR に影響するセキュリティ問題(コード、デプロイメント、または同梱の依存関係のいずれか)を発見した場合は、security@abundera.ai に非公開で報告してください。72時間以内のトリアージを目指しています。/.well-known/security.txt ファイルの連絡先からも連絡できます。

バグバウンティについて(現時点では未実施)

現在、有償バウンティは提供していませんが、確認された有効な報告はすべて変更履歴と公開の謝辞でクレジットされます。

上記の内容を検証する

このページのすべての主張は、私たちを信頼することなくブラウザの DevTools から検証できます:

連絡先

セキュリティに関する開示:security@abundera.ai

最終更新:2026-09-03。次回レビュー:2026-12-03。