okkez です。

2010年1月21日0:31 ShingoKintaka <kamuycikap / tulip.ocn.ne.jp>:
> Shingo Kintakaです。
>
> 現在、会社等で利用される事の多い「問合せフォームCGI」を作成しております。
> 実行環境は@niftyが提供するLacoocanサービス。

http://lacoocan.nifty.com/service/outline.htm
によると Ruby1.8.6 ですね。

長すぎて引用も面倒なのでざっと読んで気付いた点をいくつか。

* コメントが多すぎやしませんか?
変数名やメソッド名が十分にわかりやすい場合はコメントを書かない方がコードが読みやすく
なると思います。RDocとかでドキュメントを書いているならそれはそれで構わないんですが、
コメントの内容はもう少し吟味した方がよろしいかと。

* rescue で全ての例外を捕捉できるわけではありません
resucue 節は捕捉する例外を省略すると StandardError (とそのサブクラス)を捕捉します。
例外クラスについて調べてみてください。

* attr_accessor の引数が PascalCase で気持ち悪い
Ruby ではメソッド名は単語の区切りをアンダーバーにするスタイルが好まれています。
クラス名やモジュール名は PascalCase です。

* ERB#run で binding を渡していないためインスタンス変数が参照できていない
Kernel.#binding というメソッドでそのコンテキストのバインディングを取得できます。

class Foo
  def output
    @bar = 'barbar'
    ERB.new("path_to_erb_template", nil, "-").run(binding)
  end
end

みたいな感じです。
この辺はリファレンスマニュアルやるびまをちゃんと読むと書いてあるかもしれません。
http://doc.okkez.net/186/view/class/ERB

CGI にしなくてもローカルで動作確認は出来るはずなので確認してみてください。

* 発生したエラーを標準出力に出力している
logger などを使用してログファイルに出力した方がいいと思います。
また、CGIでよくわからないエラーが出たときは Apache などの HTTP サーバのエラーログを読むと
何かヒントが書いてあるかもしれません。

* 例のスクリプトで hogehoge.jp というドメインが使用されている
example.com や example.jp を使用してください。
例示用の URL では hogehoge.jp とか誰かが所有しているようなドメインは使わないのが無難です。
# 確かもっと強い調子で書かれてる文書がどっかにあったんだけど失念しました

* テンプレート内の <%= ... %> でユーザの入力をそのまま出力している
ユーザの入力は信用してはいけません。ちゃんとエスケープしてください。
ちなみにこの実装には致命的な脆弱性があります。XSS について調べてみてください。

* たまに変数名やメソッド名が微妙に省略されている
変な省略をするよりは完全な名前を書いた方が良いです。

* そもそも素の CGI はやめた方がいいんじゃないでしょうか
現在では Ruby on Rails 以外でも軽量の web アプリケーションフレームワークがいくつかあります。
なので、それらを学んだ方が安全なアプリケーションを手軽に作成出来るのではないでしょうか。
Rack, Sinatra, Ramaze などなど。Lacoocanで使用するのは難しいかもしれませんが。


とりあえず Ruby に関係ありそうな部分はこんなもんだと思います。
# 一部関係ないのもありますが。
HTML や Javascript にもツッコミどころがありますが、それについては自分で調べてください。
主に規格やブラウザごとの挙動の違いを調べるといいと思います。


-- 
okkez
okkez000 / gmail.com