😭

.invalidドメインの使いみち

2021/03/30に公開

はじめに

.invalidドメインについて説明します。

invalidという名前は、インターネットのドメインネームシステム(DNS)のトップレベルドメインとして設置できないドメイン名として、IETF(Internet Engineering Task Force)がRFC2606(1999年6月)で予約したものです。

1999年、インターネット技術タスクフォースは、DNSラベルexample、invalid、localhost、testを予約し、ドメインネームシステムのルートゾーンにインストールされないようにしました。

これらのトップレベルドメイン名を予約した理由は、衝突や混乱の可能性を減らすためです。これにより、これらの名前を文書化の目的やローカルテストのシナリオで使用することができます。

このトップレベルドメインは、Uniform Resource Identifier(URI)において、エラー状態やプライバシー保護を目的とした疑似ドメイン名として使用されることがあります。顕著な例として、セッション開始プロトコル(SIP)では、SIP URIのドメイン名anonymous.invalidは、発呼者の身元を隠すことを示している。

といった感じで、 https://en.wikipedia.org/wiki/.invalidwww.DeepL.com/Translator(無料版)で翻訳しました。
localhostとexampleはドメインとして認識する機会が少ないですし、testドメインは非常に多くのテストドメインを作成することができるため使ったことがある人も一定数いることでしょう。

http://localhost/
http://example/
http://one.test/
http://two.test/
http://three.test/

この約22年間存在し続けているにもかかわらず何に使うか皆目検討つかないinvalidドメインの使いみちを考えてみました。
もちろんinvalidの意味は「無効」ですので使用しても何かウェブサイトにつながるわけではありません。ChromeではDNS_PROBE_FINISHED_NXDOMAINを返します。

https://example.com.invalid/

ケース1

1つ目が先に説明したSession Initiation Protocolで使用されているように非通知(匿名)で使用するパターンです。

sip:anonymous@anonymous.invalid

ウェブアプリなどでメール登録が任意であるにも関わらず、NOT NULL制約を行いたいときに使用するなど、メールアドレスを入力するケースは多いと思うのでこのような状況だと匿名アドレスとして使用できそうです。

mailto:anonymous@anonymous.invalid

もちろん受信できないメールアドレスなので場合によっては全く役に立たないケースもあります。

ケース2

受信できないメールアドレスを作成できるため、非常にコンパクトなDBを運用する際、論理削除した際など、メールを送信したくない状況で使用するケースです。

+----+------------------+------------+---------------------+---------------------+
| id | email            | is_invalid | created_at          | updated_at          |
+----+------------------+------------+---------------------+---------------------+
|  1 |     one@one.test |          1 | 2021-01-01 12:00:00 | 2021-01-01 12:00:00 |
|  2 |     two@two.test |          1 | 2021-01-02 12:00:00 | 2021-01-02 12:00:00 |
|  3 | three@three.test |          0 | 2021-01-03 12:00:00 | 2021-01-03 12:00:00 |
|  4 |   four@four.test |          0 | 2021-01-04 12:00:00 | 2021-01-04 12:00:00 |
|  5 |   five@five.test |          0 | 2021-01-05 12:00:00 | 2021-01-05 12:00:00 |
|  6 |     six@six.test |          1 | 2021-01-06 12:00:00 | 2021-01-06 12:00:00 |
|  7 | seven@seven.test |          0 | 2021-01-07 12:00:00 | 2021-01-07 12:00:00 |
|  8 | eight@eight.test |          0 | 2021-01-08 12:00:00 | 2021-01-08 12:00:00 |
|  9 |   nine@nine.test |          0 | 2021-01-09 12:00:00 | 2021-01-09 12:00:00 |
+----+------------------+------------+---------------------+---------------------+

これはMVCでよくあるSQLデータベースをものすごくシンプルにしたものですが、invalidドメインを使うことでis_invalidを使わずにemailだけで表現することができます。

+----+----------------------+---------------------+---------------------+
| id | email                | created_at          | updated_at          |
+----+----------------------+---------------------+---------------------+
|  1 | one@one.test.invalid | 2021-01-01 12:00:00 | 2021-01-01 12:00:00 |
|  2 | two@two.test.invalid | 2021-01-02 12:00:00 | 2021-01-02 12:00:00 |
|  3 |     three@three.test | 2021-01-03 12:00:00 | 2021-01-03 12:00:00 |
|  4 |       four@four.test | 2021-01-04 12:00:00 | 2021-01-04 12:00:00 |
|  5 |       five@five.test | 2021-01-05 12:00:00 | 2021-01-05 12:00:00 |
|  6 | six@six.test.invalid | 2021-01-06 12:00:00 | 2021-01-06 12:00:00 |
|  7 |     seven@seven.test | 2021-01-07 12:00:00 | 2021-01-07 12:00:00 |
|  8 |     eight@eight.test | 2021-01-08 12:00:00 | 2021-01-08 12:00:00 |
|  9 |       nine@nine.test | 2021-01-09 12:00:00 | 2021-01-09 12:00:00 |
+----+----------------------+---------------------+---------------------+

これだと有効なメールアドレスを抽出できないように見えますが、SQLにおけるNOT LIKE文を使うことで抽出することができます。

SELECT * FROM db.posts WHERE email NOT LIKE '%.invalid';
+----+------------------+---------------------+---------------------+
| id | email            | created_at          | updated_at          |
+----+------------------+---------------------+---------------------+
|  3 | three@three.test | 2021-01-03 12:00:00 | 2021-01-03 12:00:00 |
|  4 |   four@four.test | 2021-01-04 12:00:00 | 2021-01-04 12:00:00 |
|  5 |   five@five.test | 2021-01-05 12:00:00 | 2021-01-05 12:00:00 |
|  7 | seven@seven.test | 2021-01-07 12:00:00 | 2021-01-07 12:00:00 |
|  8 | eight@eight.test | 2021-01-08 12:00:00 | 2021-01-08 12:00:00 |
|  9 |   nine@nine.test | 2021-01-09 12:00:00 | 2021-01-09 12:00:00 |
+----+------------------+---------------------+---------------------+

メール一斉送信を行うコードを書いた際、typoなどを行ってしまい誤って無効なメールアドレスを取得してしまったとしても、invalidドメインにしてしまうことで誤送信を防止することができます。これはis_invalidなどを使用した場合では得られないメリットです。

ケース3

プログラミングとは関係ないケースとして、ブックマークやmarkdownメモに残しておきたいけど、リンクをクリックしてもアクセスできないリンクを作成したい時に使用できます。

https://twitter.com.invalid/

このようにブックマークを変更することで簡単にツイ禁できます。全くツールを使ったりしないので簡単ですね!

真面目な話、ブックマークしたウェブサイトがデッドリンクでフィッシングサイトになることはあると思うので、このような方法で思い出のウェブサイトやログファイルを残すことが可能になると思います。

おわりに

頑張ってアイデアを出してみたものの少し便利になる程度でしたが、皆さんも是非example、localhost、testと比較して影が薄いinvalidくんを大事にしてあげてください。

参考文献

https://en.wikipedia.org/wiki/.invalid
https://tools.ietf.org/html/rfc2606
https://tools.ietf.org/html/rfc3325

Discussion