セキュリティ

不審なダウンロードリンクを防ぐAIプロンプトと公開前スキャン

AIに「ダウンロードボタン付きのHTML」を作らせると、参照先URLが架空のドメインや廃止されたURLになっているケースが少なくありません。この問題はプロンプトに一行追加するだけで大幅に減らせます。この記事では、AIプロンプトの書き方と生成後の自動スキャン手順を組み合わせた二重防御策を解説します。

なぜ危ないのか

AIはダウンロードボタンのサンプル実装としてhref属性に具体的なURLを入れようとします。そのURLはAIが学習データから取得したものであり、現在も有効・安全なURLかどうかを検証していません。アクセスしてみると廃止されたサービスのエラーページ、または別の事業者がドメインを再取得して運営するサイトが表示されることがあります。

ユーザーが「〇〇社のロゴ付きでダウンロードボタンを作って」と指示した場合、AIはその会社の実際のダウンロードページURLを生成物に含めようとすることがあります。著作権・商標的な問題に加え、実際のURLが本物と異なる場合はフィッシングページへのリンクと同じ構造になります。架空のプレースホルダーURLを使わせるプロンプト設計が重要な理由がここにあります。

  • 相手がログインなしで開ける状態か確認する
  • PCとスマホで最低1回ずつ表示を確認する
  • 内部情報・個人情報・不要な外部送信が残っていないか見る
  • レビュー期限と修正時の差し替え方を決めておく

ソースで見る場所

生成されたHTMLでまず確認するのは`<a href='...' download>`タグです。次に`<button onclick='window.open(...)'>`のようなJavaScriptでURLを直接記述しているコードを探します。`grep -n 'window.open\|location.href\|location.assign' *.html` を実行すれば、スクリプト内のURL指定を一覧できます。

Fetch APIやXMLHttpRequestでファイルをBlobとして取得してからダウンロードさせるパターンも確認が必要です。`fetch('http://external.com/file.zip').then(r=>r.blob())` のような記述がscriptブロックにある場合、ページ読み込み後にユーザーが気づかないうちに外部通信が発生することがあります。`grep -n 'fetch\|XMLHttpRequest' *.html` で確認してください。

  • HTML内の外部script・form action・iframeを確認する
  • APIキーやトークンらしき文字列がないか検索する
  • 画像・CSS・JSのパスが公開後も解決できるか見る
  • noindexと認証を混同せず、必要なら両方設定する

安全に共有する設定

ダウンロードリンクが安全であることを確認した後は、そのファイルを認証付きのURLで配信する設定にします。S3バケットやCloudflare R2で署名付きURLを生成すれば、特定のメールアドレスを持つユーザーだけがアクセスできる設定も可能です。URLが流出してもダウンロード不可にできるため、社外共有のリスクを大幅に下げられます。

共有URLは送付相手のドメイン(@example.co.jpなど)のみアクセスを許可する設定にすることを推奨します。ギガサイト便のような会社ドメイン認証に対応したサービスを使えば、競合他社や無関係な第三者がURLを入手してもコンテンツを閲覧できないため、ダウンロードリンク先の情報を守る追加の防衛線になります。

  • HTML内の外部script・form action・iframeを確認する
  • APIキーやトークンらしき文字列がないか検索する
  • 画像・CSS・JSのパスが公開後も解決できるか見る
  • noindexと認証を混同せず、必要なら両方設定する

再発防止ルール

プロンプトに追加する制約文の例:「ダウンロードリンクのhref属性には実際のURLを入れず、`data-download-target='REPLACE_WITH_ACTUAL_URL'`というデータ属性を使い、コメントで差し替えを明示すること。download属性は保持して良い。」このようにデータ属性をプレースホルダーとして使うと、grepで`REPLACE_WITH_ACTUAL_URL`を検索するだけで未差し替え箇所を一覧できます。

自動スキャンコマンドとして `grep -rn 'REPLACE_WITH_ACTUAL_URL\|href=["\']#["\']' --include='*.html' .` をMakefileに登録します。このコマンドは「プレースホルダーが残っている」「hrefが#のまま」というケースを両方検出するため、送付前チェックの最後に走らせると安心です。

  • HTML内の外部script・form action・iframeを確認する
  • APIキーやトークンらしき文字列がないか検索する
  • 画像・CSS・JSのパスが公開後も解決できるか見る
  • noindexと認証を混同せず、必要なら両方設定する

よくある質問

AIが生成したURLを信頼してそのまま使うことは絶対にダメですか?

AIが提示したURLはあくまでも参考例です。使用する前にブラウザで実際にアクセスして目的のファイルが配信されているか確認し、VirusTotalでドメインの安全性を確認するプロセスを必ず経てください。

自動スキャンで問題なしと判定されたら目視確認は省略できますか?

省略は推奨しません。スキャンはパターンマッチで動作するため、難読化されたURLや動的生成URLは検出できません。スキャン後にブラウザでページを開き、ネットワークタブで実際の通信先を目視確認する手順を組み合わせてください。

ダウンロードリンクがなくHTMLに画像埋め込みのみの場合もスキャンは必要ですか?

画像のsrc属性が外部ドメインを指している場合は情報漏えいの観点でチェックが必要です。外部画像サービスはリクエストログからアクセス元IPを収集することがあるため、会社内部の情報が含まれるページでは外部画像参照を避けることを推奨します。

関連記事

セキュリティ

APIキー直書きを防ぐAIプロンプトと公開前スキャン

AI生成HTMLへのAPIキー直書きをプロンプト設計で防ぎ、公開前スキャンで二重検出したい開発者・制作担当者向け。具体的なプロンプト文言とgrepコマンドをセットで紹介します。

4分で読める
「セキュリティ」の記事をもっと見る →