• ベストアンサー

Javascriptによる時間に応じたアクセス制限を確実にする方法

CGIの中に、 ($sec, $min, $hour, $day, $mon, $year) = localtime(time); として return"恐れ入りますが、現在は受付時間外です" if $hour < 10 && $hour > 22; で深夜から朝にかけてのフォーム受付を拒否する仕組みになっているPerlのCGIがあるのですが、これだと、フォームを送信しにアクセスする側のパソコンの時計が狂っていたり意図的にPCのカレンダーをいじって時間帯制限をかいくぐられるとエラーにならずにフォームが送信されてしまいます。 このような抜け穴をなくし、実際の日本時間が22時以降20時以前の場合はPCの時計が何時になっていようと「申し訳ありませんが…のメッセージを表示できるようにするにはどうしたら良いでしょうか? おわかりの方がいらっしゃいましたらどうか具体的なソースをご教授いただきたく、どうかよろしくお願い致します。

  • MORGEN
  • お礼率100% (466/466)

質問者が選んだベストアンサー

  • ベストアンサー
noname#25358
noname#25358
回答No.1

 そのシステムは JavaScript でしょうか? CGIでしょうか?  CGIであれば、そのような抜け道は発生しえませんし、逆に JavaScript であれば、サーバー側から現在時刻を渡してあげないかぎり無理ではないでしょうか。

MORGEN
質問者

お礼

早速のお返事、どうもありがとうございます。 そうですか、Javascriptではやはり無理なんですね。

MORGEN
質問者

補足

>そのシステムは JavaScript でしょうか? CGIでしょうか? PerlのCGIの中に 「return "xxxxx" if $xx= y;」 というくだりがあったので、CGIのいじり方を殆ど知らない私の対処法としてJavascriptでlocaltimeを取得して制限する方法をCGIの中に埋め込んであるんです。 CGIで制限する方法って、確実なんですね? とすると、「return "xxxxx" if $xx= y;」(これは元々CGIに有ったエラーを返す部分のソースです)をどのように書き換えたら制限できるのでしょうか? 何度もお手数をおかけして恐縮ですが、教えて頂けますでしょうか?

その他の回答 (1)

  • chack
  • ベストアンサー率50% (9/18)
回答No.2

CGIとJavascriptのソースを混同なさっていませんか? Javascriptで時刻を取得する場合は ($sec, $min, $hour, $day, $mon, $year) = localtime(time); でなく、 document.write(seigen[myDate.getHours()]); などとなるはずです。 「return"恐れ入りますが、現在は受付時間外です" if $hour < 10 && $hour > 22;」 のまま、ご自分のPCの時計をいじって動作チェックをしてみてはいかがでしょう?

MORGEN
質問者

お礼

早々のアドバイスをどうもありがとうございます。 あれっ?そうですね。おっしゃる通り、PCの時計を狂わせて送信してみたところ、それでもエラーチェックに引っ掛かりました。 どうもお世話になりました!

MORGEN
質問者

補足

どうもCGIとjavascriptのソースの書き方の違いがよく解っていないようです。ご面倒をおかけしました。 deagleさん、おっしゃる通りでした。どうもすみませんでした。

関連するQ&A

  • localtimeについて

    まだCGIを勉強はじめのなのですが、localtimeについて質問させてください。 書籍で時間取得には ($sec,$min,$hour,$mday,$mon,$year,$wno) = localtime(time); とし、time関数で得たものをlocaltime関数で整形 といった事が書かれています。 まずわからないのが最初の ($sec,$min,$hour,$mday,$mon,$year,$wno) = の部分なのですが、カッコ内に変数を並べるというのはどういった命令なのでしょうか?書籍ではここまででこのような使い方や記述は出てきていないので、それ自体がよく理解できずにいます。それとも($sec,$min,$hour,$mday,$mon,$year,$wno) = localtime(time);をおきまりパターンとしてワンセットで覚えるべき事なのでしょうか。 続いてlocaltime(time)ですが、これは()内のtime関数によって取得された1970年基準からの秒数を、localtimeによって英語圏での標準的な日付時間表記に直して表示するという事で良いのですよね? これが、なぜ ($sec,$min,$hour,$mday,$mon,$year,$wno) とすることで各変数に割り振ることができるのかがよく分かりません。 これらはおきまりパターンとして覚えるべき事なのでしょうか?それとも配列のようにあるパターンに乗っ取って書かれ得いる事で他に応用がきくような意味合いのものなのでしょうか? ご教授いただきたく思います。 よろしくお願いします。

    • 締切済み
    • CGI
  • Perlでの Timeの足し算

    時間の足し算をやりたい。訳あってライブラリが使えません。 方法は無いでしょうか? 仮にライブラリが使えるなら、下記のようでうまく行っています。 --------------------------------------------------- use Time::Local; $year=2008; $mon =10; $mday=24; $hours = 23; $min = 0; $sec = 0; $time = timelocal($sec, $min, $hours, $mday, $mon - 1, $year); $a1=($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($time ); $mytimeORG= sprintf("%04d/%02d/%02d %2d:%2d", $year + 1900, $mon +1, $mday,$hour,$min); print "$mytimeORG\n"; ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($time + 32400); #9H加算 $mytime9H= sprintf("%04d/%02d/%02d %02d:%02d", $year + 1900, $mon +1, $mday,$hour,$min); print "$mytime9H\n"; ---------------------------------------------

    • ベストアンサー
    • Perl
  • 掲示板への書き込み時間

    掲示板CGIについて質問です。 使おうとしているスクリプトはそのままアップロードすると書き込みした時間の表示が 「4/14 (Sun) 17:10」 のようになります。 これを 「2003 4/14 (日) 17:10:50」 のように年と秒まで加えたいのです。 それで後者のように表示される掲示板CGIを参考にしてみましたが、目立った違いはないように思え、どこをどう変更すれば年や秒まで表示されるようになるかわかりません。 思い当たる部分はこのあたりなのですが…。 ↓このように記述されています ************ $ENV{'TZ'} = "JST-9"; ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $year = sprintf("%02d",$year + 1900); $month = sprintf("%02d",$mon + 1); $mday = sprintf("%02d",$mday); if ( substr($month,0,1) == 0 ) { $month =~ s/0/ /; } if ( substr($mday,0,1) == 0 ) { $mday =~ s/0/ /; } $hour = sprintf("%02d",$hour); $min = sprintf("%02d",$min); $sec = sprintf("%02d",$sec); $youbi = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat') [$wday]; $date_now = "$month/$mday ($youbi) $hour:$min"; ************ CGIに手を加えてレイアウトの変更くらいはいつもやっています。 もし書き換える方法がありましたら教えていただければと思います。 どうぞよろしくお願い致します。

    • ベストアンサー
    • CGI
  • 先月(YYYYMM)の生成方法

    言語は問いません。 先月をYYYYMM形式の文字列で得るクールな方法ってありますか? Perlで以下のように書けば正しく動きますが、なんかダサイ気がします。 my ($sec, $min, $hour, $mday, $mon, $year) = localtime ; $year -= 1 if $mon == 0; $mon = '12' if $mon == 0; $yearmonth = sprintf("%4d%02d", $year+1900, $mon); よろしくお願いします。

  • CGIについて(時間表示)

    CGI初心者ですが、掲示板を作成中です。投稿するたびにメッセージの投稿時間がすべて現在時刻に書き換わります。 メッセージ毎に時間表示させたいのですが、いかのプログラムのどこを変更すればよいのでしょうか?宜しくお願いいたします。 # 時間処理 sub totime { ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime(time); $year +=1900; $month++; $year = sprintf("%04d", $year); $month = sprintf("%02d", $month); $mday = sprintf("%02d", $mday); $hour = sprintf("%02d", $hour); $min = sprintf("%02d", $min); $sec = sprintf("%02d", $sec); $date = "$month/$mday $hour:$sec"; }

    • ベストアンサー
    • CGI
  • 日付求め

    お世話になります。 早速ですが、perlで以下のように 現在時刻を求め表示するロジックがあります。 ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($time); $year=$year + 1900; $mon =$mon + 1; $date81 = "$year年$mon月$mday日($days[$wday])"; $date82 = "$hour時$min分$sec秒"; この時、 例えば今年末であれば、 2009年1月1日0時と表示されると思います。 これを2008年12月31日24時と表示したいのですが、 何か妙案はあるでしょうか。 宜しくお願いします。

    • ベストアンサー
    • Perl
  • 1桁の日付に0を付ける

    日時を取得して、表示する際に「2010/3/16」を、→「2010/03/16」 のように数字が1桁の時だけ「0」を足して表示させたいのですが どのようにすれば良いでしょうか。 ------------------------------------- ($sec,$min,$hour,$day,$mon,$yea,$wdy,$yday,$isdst) = localtime(time); $year = $yea + 1900; $mon++; $nitiji= join("","$year/$mon/$day"," ","$hour",":","$min"); ------------------------------------- 上記の方法で、perlで書き出したhtmlに「$nitiji」を埋め込んで表示させているのですが 「0」をつけることができず困っております。 (システム上、そのようにしたいので) できれば「print(・・・」「「printf(・・・」」などの形式ではなく 「$nitiji」に直接その数値を入れられると良いのですが。 良い方法がありましたら宜しくお願いします。

    • ベストアンサー
    • Perl
  • Perlで日付を取得する

    Perlで日付を取得する perlで1週間分の日付を取得し、セレクトボックスに格納したいと思っています。 なるべくいま使っているサブルーチンを使いたいです。 # 現在日時を文字列化する sub get_date_string { # local(@week) = ("日", "月", "火", "水", "木", "金", "土"); local(@week) = ("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"); local($sec, $min, $hour, $day, $mon, $year, $weekday) = localtime(time); $year += 1900; $mon++; # 文字列化する if ($hour < 10) { $hour = "0$hour"; } if ($min < 10) { $min = "0$min"; } if ($sec < 10) { $sec = "0$sec"; } $weekstr = $week[$weekday]; return "$year-$mon-$day ($weekstr) $hour:$min"; # return "$year年$mon月$day日 ($weekstr) $hour時$min分$sec秒"; } これを別のルーチンで、 $today = substr(&get_date_string,0,10); $kinou = $today - 1; $ototoi = $today - 2; として、今日の日付だけでなく、昨日、おととい、その前の日を取得したいと試みましたが、今日は取得できても、$kinouや$ototoiは、すごい数字になってしまいます。 変わりに -24*3600と引いてみましたがダメでした。 文字列に変更されていないから引けないのでしょうか? かんたんに処理できそうでできないので、詳しいやり方を教えてください。

    • ベストアンサー
    • Perl
  • CGIのライブラリ表示について。

    初心者で申し訳ございません。 今現在、参考書を読みながら時間を表示するCGIを作っています。 フォルダ"time1"に二つのファイル"time1.html"と"time1.pl"があります。 それぞれのファイルは、本を参考に次のように記述しています。 ===time1.html=== <html> <title>time1</title> <body> <h1>時間を表示する</h1> <hr /> <!--#exec cmd="./time1.pl"--> </body> </html> ====== ===time1.pl=== #!/usr/local/bin/perl ($sec, $min, $hour, $day, $mon, $year, $wdy, $yday, $isdst) = localtime(time); @youbi = ("日", "月", "火", "水", "木", "金", "土"); $year += 1900; $mon++; print "$year-$mon-$day, @youbi[$wdy], $hour:$min:$sec\n"; exit; ====== 以上をIE7で表示しますと、 「時間を表示する」は表示されるものの、.plファイル内の時間が表示されません。 何かやり残していることがありますでしょうか。 申し訳ございませんが、よろしくお願いいたします。

    • ベストアンサー
    • CGI
  • フォームメール、時刻を設定してその時間に送信されるようにしたい。

    こんにちわ。フォームメールで時刻を設定して、その時間に送信できるようにしたいのですが可能でしょうか?以下のように書いたのですが、うまくいきませんでした。どうかご教授ねがいます。よろしくおねがいします。 $gettime = '200511251300'; ###2005年11月25日13時00分に送信したい。 sub menu { print "Content-type: text/html\n\n"; print <<EOF; <html> <head> </head> <body> <form method="post" action="$script"> <input type="hidden" name="action" value="send"> <input type="submit" value="配信確認"> </form> </table> </body> </html> EOF } sub send{ if($gettime eq $gettime){&sendmail;} else{&mes('設定した時間に送信します')} } sub sendmail{ #メール送信のサブルーチン省略 } sub mes{ 「設定した時間を送信する」を表示するHTML省略 } sub time{ ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); @wday_array = ('日','月','火','水','木','金','土'); $timedata = sprintf("%04d%02d%02d%02d%02d",$year+1900,$mon +1,$mday,$hour,$min); $years=$year+1900; $mons=$mon+1;

    • ベストアンサー
    • Perl