「一度しか見られないページ」を公開するサーバを作ってみる
Cicada 3301 というミームをご存知だろうか。Twitter 上に投稿された暗号パズルなのだが、その中で「最初に正解に辿り着いた人しか閲覧できないウェブページ」という内容が出てきた。
最初に正解に辿り着いた人しか閲覧できないウェブページ…
一人しか閲覧できないページ…
一度しか見られないページ…
なんとも面白そうだ。
…
ということで作ってみた。
目次
先に成果物
一度しか見られないページを実現する、Node.js 製のプログラムを書いてみた。ソースコードは以下。
$ npm start
でサーバ起動後、http://localhost:8080/secret
にアクセスすると、初回だけは「秘密のメッセージ」が見えるが、F5 更新などして再度アクセスすると、もうそのメッセージが見られなくなる、という作りになっている。
もう一度試してみたい場合は、$ npm run reset
を実行すると、秘密のメッセージを書き込んだ secret.txt
を生成し直すので、再度「秘密のメッセージ」が1回だけ見られるようになる。
仕組み
このサーバは、次のような仕組みで動いている。
- 予め、秘密のメッセージを書き込んだ
secret.txt
を用意しておく - サーバ起動後、秘密のページへの初回アクセスがあったら
secret.txt
の中身を取得し、secret.txt
を削除してからレスポンスする → 秘密のメッセージが閲覧できる - 以降、秘密のページへのアクセスがあっても、
secret.txt
が存在しないため、秘密のメッセージが閲覧できない
$ npm run reset
コマンドの処理内容は、この手順 1. にあたる。
特定のページ (このプログラムでは /secret
というパス) へのアクセスがあったら、fs.readFileSync()
で secret.txt
を取得して、その中身をレスポンスし、fs.unlinkSync()
でファイルを削除している。コレにより、そのサーバ内に不正侵入できたとしても、「秘密のメッセージ」の内容は二度と見られなくなる、という寸法だ。
なお、当初は、「秘密のページにアクセスがあったかどうか」をチェックするフラグファイルでも生成して管理しようかと考えていた。
- 秘密のページへのアクセス時、フラグファイルの存在チェックを行う
- フラグファイルが存在しなければ初回アクセスとみなし、フラグファイルを生成した上でレスポンスする → 秘密のメッセージが閲覧できる
- フラグファイルが存在すれば2度目以降のアクセスとみなし、秘密のメッセージをレスポンスしない
このやり方だと、サーバ上に秘密のメッセージの情報が残り続けることになるので、よりセキュア (?) にしようと思って、秘密のメッセージが書かれたファイルを削除する、という仕組みにしてみた。
以上
…作ったは良いけど、コレ、何かに使えるかな……。