#!/usr/bin/env ruby19 # coding: utf-8 # fruits3.rb require 'sqlite3' require 'kconv' require 'cgi' $myname = 'fruits3.rb' $dbfile = "tmpdb/fruits.sq3" # セッションキーのPREFIXを、接続IPアドレス+日付にしていずれか一方でも # 変わった場合は使えないようにする。 skeyprefix = ENV["REMOTE_ADDR"] + Time.now.strftime("/%Y%m%d%H/") cgi = CGI.new(:accept_charset => "utf-8") db = SQLite3::Database.new($dbfile) # ログイン画面から来たものであれば,パスワード照合し,セッションキーを生成 # して表に格納する。 user = cgi['user'] # ログインフォームから来た場合値が入る authok = nil # 認証できたかどうか @cookie = Hash.new # cookieをHashに取得 if (c=ENV['HTTP_COOKIE']) # 環境変数 HTTP_COOKIE にcookieリストがある c.split(/\s+/).each do |exp| # 空白で分解 if /(.*)=(.*)/ =~ exp # =の前後で分解 「変数=値;」 @cookie[$1] = CGI::unescape($2).chomp(";") # 末尾セミコロンは剥ぎ取る end end end skey = @cookie['skey'] # cookieにある(はずの)セッションキー if user && user > "" # ログインフォームからきた場合 pswd = cgi['pswd'] r = db.execute("select pswd from user where uname = ?", user)[0] if r && pswd.crypt(r[0]) == r[0] # r[0]はdb内のpswd # パスワード照合OKなので新セッションキーを「IPアドレス+ランダム」で生成 skey = skeyprefix+ [*'a'..'z'].sample(14).join db.execute("update user set skey = ? where uname=?", skey, user) authok = true # 認証フラグON elsif pswd == "wasureta" if /(.*)@(.*)/ =~ user system "../useradm.rb #{user} #{$dbfile} | Mail -s newuser #{user}" end end elsif skey && skey > "" user = @cookie['user'] r=db.execute("select skey from user where uname = ?", user)[0] skeyinfo = [user, r] # デバッグ用 if r && r[0] && r[0] == skey # cookie skey == saved skey if skey.index(skeyprefix) == 0 # セッションキーが継続して使えるものか検査 authok = true # 認証フラグON end end end if authok # 認証成功ならcookie更新 (HTML本文より先に送出する) # 5時間有効 expires = (Time.now.gmtime+3600*5).strftime("%a, %d-%m-%Y %H:%M:%S GMT") printf("Set-Cookie: skey=%s; expires=%s\n", skey, expires) printf("Set-Cookie: user=%s; expires=%s\n", user, expires) end # HTMLヘッダの出力 (
まで) print <<_EOF_ Content-type: text/html; charset=utf-8[%s] が正常に登録されました。
\n", name.toutf8) # 新規書き込み登録/update ここまで elsif rm && rm > "" # 削除ボタンを押したとき cgi.keys.each do |k| # keysで変数一覧. rm_#{id} があるはず next unless /rm_(\d+)/ =~ k # CGI変数名が rm_X でなければスキップ db.execute("delete from kudamono where id=?", $1.to_i) end end def mktable(heading, result) # select の結果を表形式で一覧表示するメソッド h = "