【Perl】CGIのログインフォームを設置しています。IDとパスワードのみの簡単なものです。

認証OKの際に、ある別のホームページのURLへ飛ばしたいのですが、下記の部分をどう書き換えて
リンクさせればよいのでしょうか?

いまはそれぞれOKの場合とNGの場合のhtmlファイルを表示するソースになっています。


#!/usr/bin/perl
use strict;
require "cgi-lib.pl";

my %passwords = ('hoge','hoge',);
my $ok = "hoge.html";# パスワードが一致した場合の表示ファイル
my $ng = "error.html";# パスワードが違った場合の表示ファイル
.
.
.


ご指南宜しくお願いします。

回答の条件
  • 1人1回まで
  • 登録:
  • 終了:2006/12/24 15:27:12
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答3件)

id:mizu1007 No.1

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

ポイント35pt

こんにちは。

どこを聞きたいのか分からないのでとりあえず、方法だけ。

●[ID・PASSが正しいかチェックする]

サンプル(パスワードをチェック)

if($id eq "pass" && $pass eq "pass"){#正しい場合の処理}

else{#PASSを誤った場合の処理}

[参考]

http://www.iis.u-tokyo.ac.jp/~susaki/perl/condition.html

●[POST・GETからデータを受け取る]

sub post_data{

my $buffer;

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

my @pairs = split(/&/,$buffer);

my $pair;

my %form;

foreach $pair(@pairs){

my ($name, $value) = split(/=/,$pair);

$value =~ tr/+/ /;

$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

$form{$name} = $value;

}

return \%form;

}

[参考]

http://chain.main.jp/perl/cgi.html


●[リダイレクトの方法]

my $url="http://sample.com"; #ファイルが置いてあるURLを書く

#サンプル(OKのHTMLに飛ぶ)

print "Location: $url$ok\n\n";


[参考]

http://www.futomi.com/lecture/ohter/redirect.html

id:kentajoy

有難うございます!

おそらく「リダイレクトの方法」の部分のことだと思います。

アドバイスを参考に、下記のように書き換えたのですが、パスワードを間違えても全部my $ok = "hoge.html"へ繋がってしましいました。。

パスワードを間違えた時には、my $ng = "error.html";に飛ばすには何か足りないのでしょうか?

#!/usr/bin/perl

use strict;

require "cgi-lib.pl";

my %passwords = ('hoge','hoge',);#

my $url="http://sample.com"; #各ファイルが置いてあるURL

my $ok = "hoge.html"; #パスワードがOK場合の表示ファイル

print "Location: $url$ok\n\n";

my $ng = "error.html";# パスワードが違った場合の表示ファイル

print "Location: $url$ng\n\n";




その後のソース

my %input;

&ReadParse(\%input);

my $id = $input{'id'};

my $pass = $input{'pass'};

my $files = "";

my @key = keys %passwords;

my $idcount = 0;

foreach my $i(@key){

if($i eq $id){

$idcount++;

my $value = $passwords{$i};

if($pass eq $value){

$files = $ok;

next;

}

}

}

my $ermsg;

unless($files){

$files = $ng;

unless($id){

$ermsg = "ユーザーIDを入力してください。";

}

elsif($pass eq ""){

$ermsg = "パスワードを入力してください。";

}

elsif(($id)&&($idcount eq 0)){

$ermsg = "IDが一致していません。";

}

else{

$ermsg = "パスワードが一致していません。";

}

}

my $str = "";

if(open(FP,"<$files")){

&file_lock(*FP);

while(<FP>){$str .= $_};

flock(FP,8);

close(FP);

}

$str =~ s//$ermsg/;

print<<"END";

Content-type: text/html

$str

END

2006/12/23 16:51:39
id:kn1967 No.2

回答回数2915ベストアンサー獲得回数301

ポイント35pt

一人当たり1回までしか回答できず、また、コメントもつけられないという設定になっているので、続けての回答をしたくても出来ずに困っておられるかもしれません。

失礼ながら、横槍を入れさせていただきますが、、、、

質問者様のコードを見る限り『URLに飛ばす』ではなく『URL先からファイルを取得して表示する』になっていますが、どちらをお望みですか?


『URLに飛ばす』のであれば、

if($pass eq $value){

 $files = $ok;

 next;

}

の中を、1/で回答いただいている

if($pass eq $value){

 my $url="http://sample.com"; #ファイルが置いてあるURLを書く

 print "Location: $url$ok\n\n";

 exit;

}

に変更すればよろしいでしょうけど、、、


『ファイルを取得して表示する』のであれば、

socketを使うために長ったらしいコードが必要になります。

http://ash.jp/perl/socket_http.htm

↑上記ページのhttp.plのソースが比較的わかりやすいと思いますので、見ていただきたいのですが、phpと違ってPerlでのURL取り込みは非常に面倒ですし、セキュリティや倫理的な穴を開ける可能性のあるものなのでプロバイダによってはソケットを実装していない場合もあるので注意が必要です。

改造するとすれば、ソケットを組み込む位置は上記の『URLに飛ばす』と同じ場所で良いでしょう。

id:kentajoy

ご丁寧な回答いただきまして有難うございます。

アドバイスいただいた内容を参考に試してみたいと思います。非常に参考になりました。

2006/12/24 15:26:50

質問者が未読の回答一覧

 回答者回答受取ベストアンサー回答時間
1 kazuokohchi 3 1 0 2006-12-23 22:01:47

コメントはまだありません

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

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

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

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