短縮リンクは中身の見えないリダイレクトです。受け取った人は、クリックする前にどこへ飛ぶのかを確認できません。この不透明さこそが製品の価値であり、同時に、運用が甘いショートナーが不正利用の道具になる理由でもあります。ショートナーを審査するなら、遷移先のスキャン、署名付きWebhook、段階別のレート制限、ハッシュ化されたAPIキー、リンクパスワード、有効期限の上限、監査ログ、IP許可リスト、ボットフィルタリング、SSOという10の対策を確認し、それぞれの回答を書面で求めてください。以下では、各対策について、確認すべき点とElidoでの実装を、2026-10-24 時点のコードで確認した内容に基づいて説明します。不十分な点は、そのまま明記します。
脅威モデル
リンク基盤では、4種類の不正利用が繰り返し現れます。
フィッシングとマルウェア。 短縮リンクは、ランディングページを指していても、認証情報を盗むフォームを指していても、見た目は同じです。100本のリンクは数秒で作れますが、配布された後の後始末には数週間かかります。
APIキーの漏えい。 キーは、クライアント側のJavaScript、公開リポジトリ、ビルドログに紛れ込みます。プロバイダーが平文で保存していれば、データベースが一度漏えいしただけで全顧客が危険にさらされます。
ボットによるクリック数の水増し。 稼働監視ツール、リンクプレビューの取得処理、クローラーは、いずれも短縮リンクをたどります。フィルタリングしないと、キャンペーンの数値や、ボリュームに応じた課金が歪みます。
大量リダイレクトの不正利用。 API利用が無制限の侵害されたワークスペースが1つあれば、1時間に数万本のリンクを作成でき、プラットフォームのドメイン評価を他人のフィッシングキャンペーンのために使い果たしてしまいます。
10の対策
以下では、各対策について、ベンダーに尋ねるべき質問とElidoの回答を示します。
1. 作成時とその後の遷移先スキャン
作成時にしか確認しないと、初日は問題なく30日目にリストへ載るURLを見逃します。同期チェックと定期的な再スキャンの両方が必要です。
Elidoのurl-scannerは、遷移先を最大5つのソースに並列で照会します。Google Safe Browsing v4、PhishTank、URLhaus、SURBL、そして自社のURL構造ヒューリスティックです(このヒューリスティックはxn--ホストを検出し、ホモグラフ型のなりすましドメインを捕捉します)。実際に動くソースは、デプロイ時のキーと管理者のポリシーによって変わります。統合スコアは各ソースの最大値で、80以上はブロック、40から79は疑わしい、40未満は問題なしです。作成経路では、スキャンに250 msの予算が与えられます。ブロックされた遷移先には403 destination_blockedが返ります。疑わしいものは、より詳しい非同期スキャンのキューに入りますが、作成直後の無料ワークスペースでは、疑わしい結果はその場で拒否されます。
知っておくべきトレードオフが1つあります。スキャナーが停止中、または応答が遅い場合、リンクの作成は続行され、そのリンクは後の再スキャンまで「不明」とマークされます。ここではハードブロックよりも可用性を選びました。
2. タイムスタンプを含めて署名するWebhook
署名のないWebhookでは、ベンダーからの通知と、エンドポイントのURLを見つけた第三者からのリクエストを区別できません。タイムスタンプとボディをまとめて署名しないと、取得したペイロードをいつまでもリプレイできてしまいます。
Elidoの配信ワーカーは、X-Elido-Signature(X-Webhook-Signatureというエイリアスもあります)にv1=HMAC-SHA256(secret, "<unix_timestamp>.<body>")を、X-Webhook-Timestampとともに送ります。シークレットのローテーション中は、猶予期間が終わるまでX-Elido-Signature-Previousも送ります。Stripeのwebhookを検証したことがあれば、v1=という形式に見覚えがあるはずです。古いタイムスタンプを拒否するのは受信側の役目です。
3. プラン別のワークスペース単位レート制限
IPごとの制限だけでは、アドレスを切り替える攻撃を防げません。そのため、制限の単位はワークスペースにすべきです。APIはプラン(free、paid、business)に応じた大きさのトークンバケットをワークスペースごとに持ち、超過時はX-RateLimit-Scope: workspace付きで429を返します。プランの照会に失敗した場合は、freeティアにフォールバックします。新規の無料ワークスペースは最初の24時間「インキュベーター」ティアに置かれ、既定では1日10リンク、ブラウザセッションでの作成にはCAPTCHA、同期スキャンの強制が適用されます。通常のワークスペースは1日1,000リンクです。
4. サーバー側のペッパーでハッシュ化したAPIキー
APIキーの平文保存は弁護の余地がありません。ElidoはHMAC-SHA256(pepper, key)を保存し、平文は作成時に一度だけ表示します。検索時は、受信したベアラートークンをハッシュ化してハッシュ同士を比較します。長いランダムなトークンには高速な鍵付きハッシュが適しており、ペッパーがあるため、データベースが盗まれただけではブルートフォースできません。キーにはexpires_atを設定できます。ローテーションは手動です(不足点の節を参照してください)。
5. Argon2idでハッシュ化したリンクパスワード
リンクパスワードはArgon2idのハッシュ(64 MiB、2イテレーション、4スレッド、PHC形式)で保存され、APIはハッシュを返さず、password_setという真偽値だけを返します。実際の不足点がある点にご注意ください。2026-10-24 時点で、公開リダイレクトサービスにはパスワード入力画面がありません。確認はルックアップAPI(X-Passwordヘッダーで、応答は401とpassword_required: true)で行われるため、リンクに設定したパスワードは、短縮URLをクリックする人に対するアクセスゲートにはまだなっていません。現時点で有効な方法は、パスワード保護リンクの記事で解説しています。厳格なアクセス制御が必要な場合は、エンドツーエンド暗号化リンクモードを使うか、遷移先に認証を設けてください。
6. 有効期限とクリック数の上限
古いキャンペーンのリンクは、キャンペーンが終わった後も長く攻撃者にとって有用です。リンクにはexpires_atとmax_clicksを設定でき、どちらもリダイレクト経路で強制されます。ライフサイクルの面については、リンクの有効期限と自己消滅リンクをご覧ください。
7. 自分で読める監査ログ
変更を伴う操作は監査イベントとして記録され、監査権限を持つメンバーがGET /v1/workspaces/{id}/auditで読めます。各行はSHA-256(prev_hash、entry_hash)で直前の行と連鎖しているため、編集や削除はチェーン検証ジョブで検知できます。コンプライアンスのエビデンスバンドル(.../compliance/evidence.zip)には、直近90日分のイベントがCSVで含まれます。保持期間はワークスペースごとに設定できます。
8. IP許可リスト
正当なAPIトラフィックがすべて既知のレンジから来るなら、許可リストによって、キーの漏えいははるかに小さな問題になります。各ワークスペースはCIDRプレフィックスを保存でき、リストが有効で空でない場合、有効なキーを持っていても、それ以外の送信元アドレスには403が返ります。クライアントのアドレスは、X-Forwarded-Forがあればそこから取得されるため、プロキシの経路が想定どおりであることを確認してください。
9. リダイレクト経路でのボットフィルタリング
エッジは、User-Agentをクローラー、プレビューボット、稼働監視ツール、HTTPクライアントのシグネチャ一覧(約45件)と照合し、空のUser-Agentはボットとして扱います。一致したリクエストにもリダイレクトは返され、抑制されるのはクリックイベントだけです。別のスコアラーは、2つ以上の弱いシグナル(User-Agentなし、Accept-Languageなし、単一IPからの連続アクセス)が重なると、ブロックはせずにそのクリックを不審としてマークします。
10. SSOとSCIM
ワークスペース単位のSSO設定、GET /v1/sso/discover?domain=でのドメイン探索、SCIM webhookにより、ログインとプロビジョニング解除をIDプロバイダーに任せられます。Elidoがパスワードを目にすることはありません。
半日でできる審査の手順
ショートナーを選別するのに、ペネトレーションテストは必要ありません。無料アカウントを作成し、自分が管理するURLを短縮して、レスポンスヘッダーとAPIドキュメントを読みます。APIキーを作成し、ダッシュボードが後からもう一度表示するかどうかを確認します。テストのWebhookを発火させ、署名ヘッダーを確認します。そのうえで、下の表をベンダーのサポート窓口に送り、返信までの時間を計ってください。
どのベンダーにも尋ねるべき質問
| 質問 | 良い回答の例 |
|---|---|
| APIキーはどのように保存していますか? | アルゴリズムと、ペッパーを使っているかどうか |
| Webhookはどのように署名していますか? | 署名対象の文字列にタイムスタンプを含むHMAC |
| どの脅威フィードをスキャンしていますか? | フィード名と、再スキャンのスケジュール |
| レート制限はワークスペース単位ですか? | はい。プランによって異なる |
| 管理者は監査ログを読めますか? | セルフサービスで、エクスポート可能、改ざん検知付き |
| リンクパスワードのハッシュ化は? | Argon2idまたはbcrypt。MD5やSHA-256は不可 |
| ボットフィルタリングは? | 文書化されており、抑制されるのはリダイレクトではなくイベント |
| ワークスペースごとのIP許可リストは? | はい。CIDRベース |
ベンダーが1行目、2行目、3行目、5行目の質問に1営業日以内に書面で答えられない場合、そのドキュメントはおそらく存在しません。
Elidoがまだ強化中の点
- レート制限はプロセスローカルです。 バケットはレプリカごとのメモリ上にあるため、レプリカがN個あると、ワークスペースは最大でN倍まで制限を超えられます。共有リミッターは計画中ですが、まだ提供していません。
- WAFはありません。 あるのは、レート制限、ボットフィルタリング、ドメインのブロックリストです。大量のトラフィックを受ける公開リンクの前段には、外部のWAFを置いてください。
- 再スキャンは即時ではなく定期的です。 スイープは6時間ごとに実行され、過去7日間にスキャンされていないリンクを再確認します。新たにフラグが立ったリンクは自動的に停止され、所有者に通知されます。フィードに載ってから数日間、リンクが有効なままになる可能性があります。
- キーのローテーションは手動です。 あるのは、任意の
expires_atだけです。 - 認証はまだありません。 ISO 27001は未取得で、SOC 2は準備中です。
- IPアドレスは切り詰められますが、削除はされません。 エッジが/24(IPv4)または/48(IPv6)に切り詰めますが、市区町村、座標、完全なユーザーエージェントは各クリックとともに引き続き保存されます。これが何を意味するかは、GDPRチェックリストで解説しています。
関連する2本の記事もご覧ください。オープンリダイレクトの脆弱性とQRフィッシングです。
ブログの関連記事
よくある質問
URLショートナーが安全かどうかは、どう見分ければよいですか?
具体的な内容を書面で尋ね、このチェックリストの10項目と照らし合わせてください。安全なショートナーは、遷移先をスキャンする脅威フィードの名前を挙げ、APIキーの保存方法を(安心させる言葉ではなく)アルゴリズムで説明し、タイムスタンプを組み込んだHMACでWebhookに署名し、ワークスペース単位でレート制限をかけ、サポートへの問い合わせなしで読める監査ログを備え、作成後にリンクが悪意あるものに変わった場合の対応を説明できます。「セキュリティを重視しています」といった曖昧な回答は警告サインです。
URLショートナーはフィッシングに使われることがありますか?
はい。短縮リンクはクリックされるまで遷移先を隠すため、攻撃者は認証情報を盗み取るページやマルウェアのダウンロードを隠すためにショートナーを悪用します。そのため、信頼できるプロバイダーは、作成時にすべての遷移先を脅威フィードと照合し、保存済みのリンクも後から再スキャンし、新規アカウントのリンク作成速度を制限し、報告を受けた不正なリンクを素早く削除します。
URLショートナーはAPIキーをどのように保存すべきですか?
平文での保存は絶対に避けるべきです。最低限、不可逆なハッシュが必要で、より良い設計ではサーバー側のシークレット(ペッパー)を混ぜ込み、データベースが漏えいしただけではオフラインで解読できないようにします。Elidoは、サーバー側のペッパーをキーとして各キーのHMAC-SHA256を保存し、平文のトークンは作成時に一度だけ表示します。APIキーは長いランダム文字列なので、高速な鍵付きハッシュで十分です。Argon2idのような低速のパスワードハッシュが重要になるのは、リンクパスワードのように人が選ぶシークレットです。
署名付きWebhookには何を含めるべきですか?
タイムスタンプと生のボディの両方に対して計算した署名と、受信側が古い配信を拒否できるよう、タイムスタンプを独立したヘッダーに含めることです。ボディだけに署名すると、攻撃者は取得したリクエストをいつまでも再送(リプレイ)できます。Elidoは、X-Elido-Signature(X-Webhook-Signatureというエイリアスもあります)にv1=HMAC-SHA256(secret, timestamp.body)を、X-Webhook-Timestampとともに送ります。シークレットのローテーション中は、受信側がダウンタイムなしで鍵を切り替えられるよう、X-Elido-Signature-Previousも追加します。
ElidoはSOC 2やISO 27001を取得していますか?
まだ取得していません。ElidoはISO 27001の認証を受けておらず、SOC 2は準備中のため、現時点でお渡しできるレポートはありません。あるのは、この記事で紹介した対策を支えるエンジニアリングで、監査ログの改ざん検知用ハッシュチェーンや、90日分のエビデンスエクスポートなどです。調達要件として認証が必須の場合は、現時点の不足点として扱い、購入前にご確認ください。
URLショートナーにWebアプリケーションファイアウォールは必要ですか?
ショートナーのリダイレクト経路は狭く、コードを検索してリダイレクトを返すだけです。そのためインジェクションのリスクは限られますが、サービス拒否や不正利用のトラフィックがなくなるわけではありません。Elidoはリダイレクト経路にレート制限、ボットフィルタリング、ブロックリストフィードを適用していますが、独自のアプリケーション層WAFはありません。大量のトラフィックを受ける公開リンクには、エッジの前段に外部のWAFやCDNのルールセットを置くほうが適しています。
Elidoを試す
URLを貼り付けて短縮リンクを取得
登録不要。リンクは30日間有効。永久に保存するには登録してください。
登録不要。無料登録すると月 50 件のリンクを作成できます。
