セキュリティ

AI生成HTMLに不審なダウンロードリンクが残っていないか確認する方法

AIが生成したHTMLに「資料をダウンロード」というリンクが含まれているとき、そのリンク先が安全なURLかどうか確認できていますか?外部の不審なドメイン、意図しないファイルパス、ローカル環境でしか解決しないパスが混入しているケースが散見されます。この記事では、公開前に不審なダウンロードリンクを検出する具体的な方法を解説します。

なぜ危ないのか

AIは指示された「ダウンロードボタン」の実装例として、架空または古いURLをhref属性に入れることがあります。`https://example.com/download/sample.pdf`のようなプレースホルダーURLが残ったままHTMLを共有すると、受け取った相手がクリックして意図しないサイトにアクセスする可能性があります。特にexample.comはサイバースクワッタが取得している場合があり安全とは限りません。

download属性付きのアンカータグ(`<a href='...' download>`)は、クリックするとブラウザが即座にファイルをダウンロードする挙動をします。リンク先が攻撃者の管理するサーバーを向いていた場合、マルウェアのダウンロードを開始させる可能性があります。ビジネス提案書などのレビュー用HTMLにこの挙動が含まれていると、クライアントのPCを危険にさらしかねません。

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

ソースで見る場所

HTMLソース内の`download`属性を持つ`<a>`タグを全件検索します。ターミナルで `grep -n 'download' index.html` を実行し、該当行のhref属性が自社管理のドメインまたは信頼できるCDNを指しているか確認します。`https://`で始まり、かつホスト名が見覚えのある正規のドメインであることを確認してください。

hrefが相対パス(例:`./files/report.pdf`)になっているダウンロードリンクも確認が必要です。ローカル開発環境では動作していても、HTMLを単体でアップロードした場合はファイルが存在せずリンク切れになります。また相対パスを使う場合は、参照先のファイルも一緒にアップロードされているか確認してください。

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

安全に共有する設定

社外レビュー用途ではダウンロードリンクを一時的に無効化することを推奨します。`<a href='#' download>`とすることでボタンのデザインは保ちながらファイルダウンロードを無効化できます。あるいはリンクを`<span>`に差し替えてCSSでボタンに見せる方法も有効です。最終納品版で本物のURLに差し替えればよいという合意を事前にクライアントと取っておくと運用がスムーズです。

ダウンロードリンクが指す実際のファイルを配信する場合は、Cloudflare R2やAWS S3の署名付きURL(Presigned URL)を活用してください。署名付きURLは指定した時間が経過すると自動で無効化されるため、レビュー期間だけアクセス可能にするという運用が可能です。

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

再発防止ルール

AIへのプロンプトに「ダウンロードリンクには実際のURLではなく`href='#'`を使い、コメントで「ここに実際のURLを入れる」と記述すること」という指示を追加します。これにより生成物の段階でプレースホルダーであることが明示され、実URLへの差し替え前に誤って公開するミスを防げます。

チームのコードレビュー項目に「download属性付きリンクのhrefが社内管理ドメインまたはプレースホルダーであること」を追加します。プルリクエストのテンプレートにチェックボックスとして記載すれば、レビュアーが忘れることなく確認できます。

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

よくある質問

download属性のないリンク(target='_blank'でファイルを開くリンク)も確認が必要ですか?

必要です。PDFやZIPなどのファイルを直接リンクしている場合、ブラウザがダウンロードとして扱います。また`target='_blank'`はreferrer情報が漏れるリスクもあるため、`rel='noopener noreferrer'`の併用を推奨します。

リンク先が本当に安全なドメインか確認する手っ取り早い方法はありますか?

WHOIS検索でドメインの登録者と登録日を確認するのが有効です。登録から日が浅いドメインや登録者情報が非公開のドメインは要注意です。VirusTotalでURLを検索する方法も補完的に使えます。

Blobオブジェクトを使ったJavaScriptによるダウンロード(URL.createObjectURLなど)も危険ですか?

Blob URLを使ったダウンロードはJavaScript内でデータを生成してダウンロードさせるため、外部通信は発生しません。ただし生成されるファイルの内容にスクリプトが埋め込まれていないか確認が必要です。

関連記事

セキュリティ

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

AIが生成したHTMLに不審なダウンロードリンクが混入するリスクを、プロンプト設計と自動スキャンで防ぎたい担当者向け。具体的なプロンプト制約文とgrepコマンドを使ったスキャン手順、および発見した際の修正方針をまとめます。

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