人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

【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";# パスワードが違った場合の表示ファイル
.
.
.


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

●質問者: kentajoy
●カテゴリ:インターネット ウェブ制作
✍キーワード:CGI hoge HTML LIB ng
○ 状態 :終了
└ 回答数 : 2/3件

▽最新の回答へ

1 ● mizu1007
●35ポイント

こんにちは。

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

●[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

◎質問者からの返答

有難うございます!

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

アドバイスを参考に、下記のように書き換えたのですが、パスワードを間違えても全部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


2 ● kn1967
●35ポイント

一人当たり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に飛ばす』と同じ場所で良いでしょう。

◎質問者からの返答

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ