WEBプログラミングで

パスワードごとに、違うファイルを表示できるプログラムを組みたいです。具体的に書くと、
クイズで答えがわかると、秘密のページに行けるようにしたいです。
himitu.php?id=1234 → パスワード(5678) →kotae.php?id=1234&pass=5678
himitu.php?id=abcd → パスワード(efgh) →kotae.php?id=abcd&pass=efgh

みたいな感じです。
プログラムは、phpとは限らないです。CGIとかでもOKです。
みたいな、感じです。参考になるページ、文献、ヒントなど、ございましたら。ご教授ください。

回答の条件
  • URL必須
  • 1人3回まで
  • 登録:
  • 終了:2006/04/05 03:28:14
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答6件)

id:wate_wate No.1

回答回数45ベストアンサー獲得回数3

ポイント5pt

データで

id,password,page_url

という項目を

データベースか別データファイル、もしくは

コード上に直接配列でもたせ、

認証に成功すれば、指定のページで

header("Location:".ページを指定している変数);

という感じで飛ばすのが

一番簡単ではないでしょうか?

同様に

クイズNo,回答,ジャンプ先ページURL

というデータ構成で、

処理すれば、同様の処理ができるのではないでしょうか?

具体的に書くのであれば、

if($_POST[クイズNo] == 回答){

header("Location:".ジャンプ先ページ);

}

クイズが複数項目になる場合は

もう少し違った書き方になるとは思いますが

基本的には、この方法でいけるのではないでしょうか?

項目名はマルチバイトで書いてますが

適時読み替えてもらえればいいと思います。

http://www.udsj.com/

id:yukky2004

ありがとうございました。早速、実践してみたいと思います。ちょっと、仕事で急いでるので、フリーのスクリプトがあればいいんですが、、

2006/03/29 18:06:47
id:m035 No.2

回答回数19ベストアンサー獲得回数0

id:yukky2004

ありがとうございました。書き忘れたのですが、携帯電話用で作りたいので、JavaScriptだと。。。ごめんなさい。先に書いておけば良かったです。

2006/03/29 18:07:52
id:bonlife No.3

回答回数421ベストアンサー獲得回数75

ポイント5pt

以前、似たような(?)質問がありました。

参考になるURLがいくつか紹介されているようですので、一度確認してみてはいかがでしょうか。

以前の質問では携帯は条件になかったので、そのあたりは考慮されていないと思いますが、使えるものもあると思います。

詳細は確認していませんが、お急ぎのようでしたので回答いたしました。

参考になると幸いです。

id:aki73ix No.4

回答回数5224ベストアンサー獲得回数27

ポイント33pt

http://nifberry.727.net/test/hatena188.htm

サンプルを作ってみたので参考にしてみてください

これはクイズ形式で質問と答えが合っていたら、画像を表示するものです

CGIのソース

#!/usr/local/bin/perl

  @ID=('adfc','gerd','vvva','f4dx');

  @PASS=('5','174','3','4');

#正しいパスワードの時に表示するファイル

  @SCFILE=('sample1.dat','sample2.dat','sample3.dat','sample4.dat');

#間違ったパスワードの時に表示するファイル

  $FLFILE='sample0.dat';

  $mthd=$ENV{'REQUEST_METHOD'};

  local($qu,@in,$key,$val);

  if($mthd eq 'GET'){

     $qu=$ENV{'QUERY_STRING'};

  }

  elsif($mthd eq 'POST'){

     read(STDIN,$qu,$ENV{'CONTENT_LENGTH'});

  }

#環境変数設定

  *query = decode();

  print qq(Content-type: image/gif¥n¥n);

#答えがあってるか確認

  for($i=0;$i<4;$i++){

   if( $query{'id'} eq $ID[$i] ){

     if( $query{'answer'} eq $PASS[$i] ){

       $FLFILE = $SCFILE[$i];

     }

   }

 }

#画像を表示

  open(FILE, $FLFILE); 

   @que = <FILE>;

   foreach $ax  (@que){

     print qq($ax);

   }

   close(FILE);

   exit;

sub decode

{

#変数の分離

  local(@query)=split(/&/,$qu);

  foreach(@query){

# "+"などを" "に置換

    tr/+/ /;

    tr/|/ /;

    tr/¥¥/ /;

    tr/;/ /;

    tr/¥`/ /;

# キーと値に分離

    ($key,$val)=split(/=/);

    $key=~s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("c",hex($1))/ge;

    $val=~s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("c",hex($1))/ge;

# 改行コードを修正する。

    $val=~s/¥r¥n/¥n/g;

    $vin{$key}=$val;

  }

  return *vin;

}


答えの部分をパスワードにして、正解時にパスワード発行するようにすれば同じように実現できます

http://nifberry.727.net/test/hatena188a.htm

CGIのソース

#!/usr/local/bin/perl

  @ID=('adfc','gerd','vvva','f4dx');

  @ANSWER=('5','174','3','4');

  @PASS=('rregebr34','1g37fg1','cior43','benrt1gb');

#正しいパスワードの時に表示するファイル

  @SCFILE=('sample1.dat','sample2.dat','sample3.dat','sample4.dat');

#間違ったパスワードの時に表示するファイル

  $FLFILE='sample0.dat';

  $mthd=$ENV{'REQUEST_METHOD'};

  local($qu,@in,$key,$val);

  if($mthd eq 'GET'){

     $qu=$ENV{'QUERY_STRING'};

  }

  elsif($mthd eq 'POST'){

     read(STDIN,$qu,$ENV{'CONTENT_LENGTH'});

  }

#環境変数設定

  *query = decode();

  if( $query{'mode'} eq 'question'){ 

    $RESULT="教えてあげないよ";

    for($i=0;$i<4;$i++){

     if( $query{'id'} eq $ID[$i] ){

       if( $query{'answer'} eq $ANSWER[$i] ){

         $RESULT = "正解なのでIDとパスワードを教えてあげるよ<BR>ID:".$ID[$i]."<BR>PASS:".$PASS[$i];

       }

     }

   }

    print qq(Content-type: text/html¥n¥n);

    print qq(<html><body>);

    print $RESULT;

    print qq(</body></html>);

  }

  else{

    print qq(Content-type: image/gif¥n¥n);

 

#答えがあってるか確認

  for($i=0;$i<4;$i++){

   if( $query{'id'} eq $ID[$i] ){

     if( $query{'pass'} eq $PASS[$i] ){

       $FLFILE = $SCFILE[$i];

     }

   }

 }

#画像を表示

  open(FILE, $FLFILE); 

   @que = <FILE>;

   foreach $ax  (@que){

     print qq($ax);

   }

   close(FILE);

  }

  exit;

sub decode

{

#変数の分離

  local(@query)=split(/&/,$qu);

  foreach(@query){

# "+"などを" "に置換

    tr/+/ /;

    tr/|/ /;

    tr/¥¥/ /;

    tr/;/ /;

    tr/¥`/ /;

# キーと値に分離

    ($key,$val)=split(/=/);

    $key=~s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("c",hex($1))/ge;

    $val=~s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("c",hex($1))/ge;

# 改行コードを修正する。

    $val=~s/¥r¥n/¥n/g;

    $vin{$key}=$val;

  }

  return *vin;

}

id:yukky2004

うわーー。わざわざ、作ってもらって、ありがとうございます。考えていた内容にかなーり近いので、とっても助かってまーす。クイズの問題が大量にあるので、

@ID

@PASS

@SCFILE

を、別ファイルから読み込めれば、完璧なんです。でも、どうもありがとうございます~~~~。

2006/03/30 02:30:45
id:aki73ix No.5

回答回数5224ベストアンサー獲得回数27

ポイント34pt

> @ID

> @PASS

> @SCFILE

> を、別ファイルから読み込めれば、完璧なんです

これは、ちょっとした応用で出来ます

配列なのでそのままファイルから読み込んで、改行だけ取り除いてあげればOKです

補足ですが image/gifのところを text/htmlにすれば

異なるHTMLを表示したり jpegにすることでJPEGファイルを指定したりできます

http://nifberry.727.net/test/hatena188a.htm

(hatena188b.cgiにリンクしています)

【CGIソース】

#!/usr/local/bin/perl

# コメントアウト

#  @ID=('adfc','gerd','vvva','f4dx');

  open(FILE, 'id188.bin'); 

   @ID = <FILE>;

   close(FILE);

# コメントアウト

#  @ANSWER=('5','174','3','4');

  open(FILE, 'ans188.bin'); 

   @ANSWER = <FILE>;

   close(FILE);

# コメントアウト

#  @PASS=('rregebr34','1g37fg1','cior43','benrt1gb');

  open(FILE, 'pass188.bin'); 

   @PASS = <FILE>;

   close(FILE);

#正しいパスワードの時に表示するファイル

# コメントアウト

#  @SCFILE=('sample1.dat','sample2.dat','sample3.dat','sample4.dat');

  open(FILE, 'image188.bin'); 

   @SCFILE = <FILE>;

   close(FILE);

# 改行の除去

   for($i=0;$PASS[$i];$i++){

      @ID[$i]=~s/[¥r¥n]//g;

      @ANS[$i]=~s/[¥r¥n]//g;

      @PASS[$i]=~s/[¥r¥n]//g;

      @SCFILE[$i]=~s/[¥r¥n]//g;

   }

#間違ったパスワードの時に表示するファイル

  $FLFILE='sample0.dat';

  $mthd=$ENV{'REQUEST_METHOD'};

  local($qu,@in,$key,$val);

  if($mthd eq 'GET'){

     $qu=$ENV{'QUERY_STRING'};

  }

  elsif($mthd eq 'POST'){

     read(STDIN,$qu,$ENV{'CONTENT_LENGTH'});

  }

#環境変数設定

  *query = decode();

  if( $query{'mode'} eq 'question'){ 

    $RESULT="教えてあげないよ";

    for($i=0;$i<4;$i++){

     if( $query{'id'} eq $ID[$i] ){

       if( $query{'answer'} eq $ANSWER[$i] ){

         $RESULT = "正解なのでIDとパスワードを教えてあげるよ<BR>ID:".$ID[$i]."<BR>PASS:".$PASS[$i];

       }

     }

   }

    print qq(Content-type: text/html¥n¥n);

    print qq(<html><body>);

    print $RESULT;

    print qq(</body></html>);

  }

  else{

    print qq(Content-type: image/gif¥n¥n);

#答えがあってるか確認

  for($i=0;$i<4;$i++){

   if( $query{'id'} eq $ID[$i] ){

     if( $query{'pass'} eq $PASS[$i] ){

       $FLFILE = $SCFILE[$i];

     }

   }

 }

#画像を表示

  open(FILE, $FLFILE); 

   @que = <FILE>;

   foreach $ax  (@que){

     print qq($ax);

   }

   close(FILE);

  }

  exit;

sub decode

{

#変数の分離

  local(@query)=split(/&/,$qu);

  foreach(@query){

# "+"などを" "に置換

    tr/+/ /;

    tr/|/ /;

    tr/¥¥/ /;

    tr/;/ /;

    tr/¥`/ /;

# キーと値に分離

    ($key,$val)=split(/=/);

    $key=~s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("c",hex($1))/ge;

    $val=~s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("c",hex($1))/ge;

# 改行コードを修正する。

    $val=~s/¥r¥n/¥n/g;

    $vin{$key}=$val;

  }

  return *vin;

}

id:yukky2004

感謝。感謝。感謝。

ほんとに、親切にありがとうございますーーーー。

先ほど、やってみたら、完璧に動きました。

ちなみに、このパスワードを日本語にしたら通らなかったんですが、やっぱ携帯だとだめなんですかね?

2006/03/30 19:15:38
id:aki73ix No.6

回答回数5224ベストアンサー獲得回数27

ポイント33pt

> ちなみに、このパスワードを日本語にしたら通らなかったんですが、やっぱ携帯だとだめなんですかね?

http://nifberry.727.net/test/hatena188b.htm

文字コードに原因があるのかもしれません(パスワードファイルがSJISで入力HTMLがUNICODEやEUCの場合はコード変換してやらなくてはいけないかも)

こちらのソースはSHIFT_JISに統一しているので問題ないですよね

あと、ファイルではなく直接PERLで代入する時に「ソ」や「表」などSJISで半角の「¥」を含むコードを入れる場合は注意が必要です

問題数にあわせて forループの数をいちいち変えないように$qmax変数を追加し、$ANSWERが一箇所 $ANSになっていたのを修正しました

これで3回目の回答で、最後なので不具合があったら、トラックバックします

CGIのソース

#!/usr/local/bin/perl

# コメントアウト

#  @ID=('adfc','gerd','vvva','f4dx','ng3jnkb','nebZnoBa');

  open(FILE, 'id188.bin'); 

   @ID = <FILE>;

   close(FILE);

# コメントアウト

#  @ANSWER=('5','174','3','4','ひんしゅく','ソ¥レラミシファ');

  open(FILE, 'ans188.bin'); 

   @ANSWER = <FILE>;

   close(FILE);

# コメントアウト

#  @PASS=('rregebr34','1g37fg1','cior43','benrt1gb','efub3arAge','特殊表¥記');

  open(FILE, 'pass188.bin'); 

   @PASS = <FILE>;

   close(FILE);

#正しいパスワードの時に表示するファイル

# コメントアウト

#  @SCFILE=('sample1.dat','sample2.dat','sample3.dat','sample4.dat','sample5.dat','sample6.dat');

  open(FILE, 'image188.bin'); 

   @SCFILE = <FILE>;

   close(FILE);

#問題の最大数を$qmaxに代入

   for($qmax=0;$PASS[$qmax];$qmax++){

      @ID[$qmax]=~s/[¥r¥n]//g;

      @ANSWER[$qmax]=~s/[¥r¥n]//g;

      @PASS[$qmax]=~s/[¥r¥n]//g;

      @SCFILE[$qmax]=~s/[¥r¥n]//g;

   }

#間違ったパスワードの時に表示するファイル

  $FLFILE='sample0.dat';

  $mthd=$ENV{'REQUEST_METHOD'};

  local($qu,@in,$key,$val);

  if($mthd eq 'GET'){

     $qu=$ENV{'QUERY_STRING'};

  }

  elsif($mthd eq 'POST'){

     read(STDIN,$qu,$ENV{'CONTENT_LENGTH'});

  }

#環境変数設定

  *query = decode();

  if( $query{'mode'} eq 'question'){ 

    $RESULT="教えてあげないよ";

    for($i=0;$i<$qmax;$i++){

     if( $query{'id'} eq $ID[$i] ){

       if( $query{'answer'} eq $ANSWER[$i] ){

         $RESULT = "正解なのでIDとパスワードを教えてあげるよ<BR>ID:".$ID[$i]."<BR>PASS:".$PASS[$i];

       }

     }

   }

    print qq(Content-type: text/html¥n¥n);

    print qq(<html><HEAD><META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; CHARSET=Shift_JIS"></HEAD><body>);

    print $RESULT;

    print qq(</body></html>);

  }

  else{

    print qq(Content-type: image/gif¥n¥n);

#答えがあってるか確認

  for($i=0;$i<$qmax;$i++){

   if( $query{'id'} eq $ID[$i] ){

     if( $query{'pass'} eq $PASS[$i] ){

       $FLFILE = $SCFILE[$i];

     }

   }

 }

#画像を表示

  open(FILE, $FLFILE); 

   @que = <FILE>;

   foreach $ax  (@que){

     print qq($ax);

   }

   close(FILE);

  }

  exit;

sub decode

{

#変数の分離

  local(@query)=split(/&/,$qu);

  foreach(@query){

# "+"などを" "に置換

# セキュリティ用

    tr/+/ /;

    tr/|/ /;

    tr/¥¥/ /;

    tr/;/ /;

    tr/¥`/ /;

# キーと値に分離

    ($key,$val)=split(/=/);

    $key=~s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("c",hex($1))/ge;

    $val=~s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("c",hex($1))/ge;

# 改行コードを修正する。

    $val=~s/¥r¥n/¥n/g;

    $vin{$key}=$val;

  }

  return *vin;

}

id:yukky2004

うわー。ありがとうございましたーーーー

出来ましたーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

2006/04/05 03:26:56
  • id:aki73ix
    トラックバック元 ダイアリ削除のため転載です
    ----------
    ちゃんと表示できない原因が分かりました

    image/gifを直接リクエストで返すと、携帯が2回リクエストを送り、2回目のリクエストのみの結果を反映、FORMの値が空っぽになるようです(原因は不明)

    そこで、一旦HTMLで経由してやるように、以下の修正を加えれば動作するようです


    #!/usr/local/bin/perl
    # コメントアウト
    # @ID=('adfc','gerd','vvva','f4dx','ng3jnkb','nebZnoBa');
    open(FILE, 'id188.bin');
    @ID = <FILE>;
    close(FILE);
    # コメントアウト
    # @ANSWER=('5','174','3','4','ひんしゅく','ソ¥レラミシファ');
    open(FILE, 'ans188.bin');
    @ANSWER = <FILE>;
    close(FILE);
    # コメントアウト
    # @PASS=('rregebr34','1g37fg1','cior43','benrt1gb','efub3arAge','特殊表¥記');
    open(FILE, 'pass188.bin');
    @PASS = <FILE>;
    close(FILE);
    #正しいパスワードの時に表示するファイル
    # コメントアウト
    # @SCFILE=('sample1.dat','sample2.dat','sample3.dat','sample4.dat','sample5.dat','sample6.dat');
    open(FILE, 'image188.bin');
    @SCFILE = <FILE>;
    close(FILE);
    #問題の最大数を$qmaxに代入
    for($qmax=0;$PASS[$qmax];$qmax++){
    @ID[$qmax]=~s/[¥r¥n]//g;
    @ANSWER[$qmax]=~s/[¥r¥n]//g;
    @PASS[$qmax]=~s/[¥r¥n]//g;
    @SCFILE[$qmax]=~s/[¥r¥n]//g;
    }
    #間違ったパスワードの時に表示するファイル
    $FLFILE='sample0.dat';

    $mthd=$ENV{'REQUEST_METHOD'};
    local($qu,@in,$key,$val);
    if($mthd eq 'GET'){
    $qu=$ENV{'QUERY_STRING'};
    }
    elsif($mthd eq 'POST'){
    read(STDIN,$qu,$ENV{'CONTENT_LENGTH'});
    }
    #環境変数設定
    *query = decode();
    if( $query{'mode'} eq 'question'){
    $RESULT="教えてあげないよ";
    for($i=0;$i<$qmax;$i++){
    if( $query{'id'} eq $ID[$i] ){
    if( $query{'answer'} eq $ANSWER[$i] ){
    $RESULT = "正解なのでIDとパスワードを教えてあげるよ<BR>ID:".$ID[$i]."<BR>PASS:".$PASS[$i]."<BR>
    <A HREF='hatena188b.cgi?mode=get&id=".$ID[$i]."&pass=".$PASS[$i]."'>今すぐ見る</a>";
    #今すぐ見る場合
    }
    }
    }
    print qq(Content-type: text/html¥n¥n);
    print qq(<html><HEAD><META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; CHARSET=Shift_JIS"></HEAD><body>);
    print $RESULT;
    print qq(</body></html>);
    }
    elsif( $query{'mode'} eq 'get'){
    print qq(Content-type: text/html¥n¥n);
    print qq(<html><HEAD><TITLE>おまけ画像</TITLE><META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; CHARSET=Shift_JIS"></HEAD><body>);
    print qq(<IMG SRC="hatena188b.cgi?mode=put&id=$query{'id2'}&pass=$query{'pass2'}">);
    print qq(</body></html>);
    }
    elsif( $query{'mode'} eq 'put'){
    # print qq(Content-type: text/html¥n¥n);
    print qq(Content-type: image/gif¥n¥n);
    #答えがあってるか確認
    for($i=0;$i<$qmax;$i++){
    if( $query{'id'} eq $ID[$i] ){
    # print $i."<BR>修正中<BR>";
    if( $query{'pass'} eq $PASS[$i] ){
    $FLFILE = $SCFILE[$i];
    }
    }
    }
    #画像を表示
    open(FILE, $FLFILE);
    @que = <FILE>;
    foreach $ax (@que){
    print qq($ax);
    }
    close(FILE);
    # break;
    exit;
    }
    exit;

    sub decode
    {
    #変数の分離
    local(@query)=split(/&/,$qu);
    foreach(@query){
    # "+"などを" "に置換
    # セキュリティ用
    tr/+/ /;
    tr/|/ /;
    tr/¥¥/ /;
    tr/;/ /;
    tr/¥`/ /;
    # キーと値に分離
    ($key,$val)=split(/=/);
    $key=~s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("c",hex($1))/ge;
    $key2=$key."2";
    $vin{$key2}=$val;
    $val=~s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("c",hex($1))/ge;
    # 改行コードを修正する。
    $val=~s/¥r¥n/¥n/g;
    $vin{$key}=$val;
    }
    return *vin;
    }

この質問への反応(ブックマークコメント)

トラックバック

  • 携帯で画像を直接表示すると・・・ 人力日記 2006-03-31 11:27:21
    ちゃんと表示できない原因が分かりました image/gifを直接リクエストで返すと、携帯が2回リクエストを送り、2回目のリクエストのみの結果を反映、FORMの値が空っぽになるようです(原因は
「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません