Corredor

ウェブ、プログラミングの勉強メモ。

簡易パスワード認証で HTML ファイルを表示する Ruby 製 CGI

Apache や nginx に配置して使える、Ruby 製の CGI を作った。

通常その CGI にアクセスすると何も表示されないが、GET パラメータでパスワードを指定すると HTML ファイルが表示される。

パスワード認証の堅牢性は弱いが、簡易的にパスワード認証をかけたい時はこんなやり方でどうかな、という紹介まで。

ファイル構成

今回は次のような構成で2つのファイルを用意する。

  • /var/www/html/secret.rb … 公開されている Ruby CGI ファイル
  • /var/www/private/secret.html … 隠しておきたい HTML ファイル

/var/www/html/ 配下が公開されていて、/var/www/private/ 配下は公開されていないファイルが置いてある、ということ。

CGI コード

secret.rb の内容は次のとおり。

#!/usr/bin/ruby

require 'cgi'
print("Content-Type: text/html; charset=utf-8\n\n")
if CGI.new()['password'] != 'MY-PASSWORD'
  print("NG")
else
  print(File.read('../private/secret.html'))
end

コードはコレだけ。とてもシンプルな作りだろう。

password という GET パラメータを取得し、その文字列が MY-PASSWORD と一致していなければ、「NG」とだけレスポンスする。

パスワードが一致している時は、/var/www/private/secret.html の内容を print() することでレスポンスしている。

パスワード文字列はベタ書きにしているが、コレも File.read() で他のファイルから拾ってきたりするなど、工夫は色々できるだろう。

CGI として動作させるため、$ chmod 755 secret.rb として実行権限を与えておこう。

アクセス方法

このようにファイルを配置したら、

  • http://example.com/secret.rb

にアクセスしてみる。すると「NG」とだけレスポンスされるはずだ。しかし、

  • http://example.com/secret.rb?password=MY-PASSWORD

とパラメータを付与すれば、secret.html の内容がレスポンスされることが確認できるはずだ。