「一度しか見られないページ」を公開するサーバを作ってみる

Cicada 3301 というミームをご存知だろうか。Twitter 上に投稿された暗号パズルなのだが、その中で「最初に正解に辿り着いた人しか閲覧できないウェブページ」という内容が出てきた。

最初に正解に辿り着いた人しか閲覧できないウェブページ…

一人しか閲覧できないページ…

一度しか見られないページ…

なんとも面白そうだ。

ということで作ってみた。

目次

先に成果物

一度しか見られないページを実現する、Node.js 製のプログラムを書いてみた。ソースコードは以下。

$ npm start でサーバ起動後、http://localhost:8080/secret にアクセスすると、初回だけは「秘密のメッセージ」が見えるが、F5 更新などして再度アクセスすると、もうそのメッセージが見られなくなる、という作りになっている。

もう一度試してみたい場合は、$ npm run reset を実行すると、秘密のメッセージを書き込んだ secret.txt を生成し直すので、再度「秘密のメッセージ」が1回だけ見られるようになる。

仕組み

このサーバは、次のような仕組みで動いている。

  1. 予め、秘密のメッセージを書き込んだ secret.txt を用意しておく
  2. サーバ起動後、秘密のページへの初回アクセスがあったら secret.txt の中身を取得し、secret.txt を削除してからレスポンスする → 秘密のメッセージが閲覧できる
  3. 以降、秘密のページへのアクセスがあっても、secret.txt が存在しないため、秘密のメッセージが閲覧できない

$ npm run reset コマンドの処理内容は、この手順 1. にあたる。

特定のページ (このプログラムでは /secret というパス) へのアクセスがあったら、fs.readFileSync()secret.txt を取得して、その中身をレスポンスし、fs.unlinkSync() でファイルを削除している。コレにより、そのサーバ内に不正侵入できたとしても、「秘密のメッセージ」の内容は二度と見られなくなる、という寸法だ。

なお、当初は、「秘密のページにアクセスがあったかどうか」をチェックするフラグファイルでも生成して管理しようかと考えていた。

  1. 秘密のページへのアクセス時、フラグファイルの存在チェックを行う
  2. フラグファイルが存在しなければ初回アクセスとみなし、フラグファイルを生成した上でレスポンスする → 秘密のメッセージが閲覧できる
  3. フラグファイルが存在すれば2度目以降のアクセスとみなし、秘密のメッセージをレスポンスしない

このやり方だと、サーバ上に秘密のメッセージの情報が残り続けることになるので、よりセキュア (?) にしようと思って、秘密のメッセージが書かれたファイルを削除する、という仕組みにしてみた。

以上

…作ったは良いけど、コレ、何かに使えるかな……。