【Perl】初心者コーナー Part17
■ このスレッドは過去ログ倉庫に格納されています
1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
CGIだけど、なんか質問ある? Part 8
http://pc.2ch.net/test/read.cgi/php/1032704121/
参考書籍の話題は【Perl,CGI】参考書籍 第三版
http://pc.2ch.net/test/read.cgi/php/1030209573/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般/Part2】
http://pc.2ch.net/test/read.cgi/php/1030548610/
スクリプトの改造依頼は 【 スクリプト改造工房 PART 5 】
http://pc.2ch.net/test/read.cgi/php/1028193595/
過去ログ、その他の役立ち情報は>>2-10あたりを見よう。
0173nobodyさん
02/10/21 17:23ID:nGDYlndqCGIで
パスワードを入力してボタンを押す
↓
パスワードが合ってるか? →エラーの為のHTML出力
↓(YES) (NO)
管理人しか見れない様なHTML出力
という風に同一CGI内でパスワードの処理をしたいんです。
んで、
<form action=\"$URL\" method=\"POST\">\n
<input type=\"hidden\" name=\"mode\" value=\"admin\">\n
<input type=\"password\" name=\"pass\" size=\"8\">\n
<input type=\"submit\" value=\"管理用\"></form>
というのを出力してみたのですが、
ここからパスワードを取得して、比べる→その結果によって出力っていうのがどうやったら良いのかわかりません。
どなかたご教授お願いします。
分からなければCGI.pmとかcgi-lib.plでも使え。
・分岐は if を使う。
・出力は print を使う。
0175173
02/10/21 17:30ID:nGDYlndqやってみます。
ありがとうございました。
0179_
02/10/21 18:01ID:???ログファイルの名前を分かり難い物に変える。
(英字と数字を組み合わせて「a5mhp3f」とか。)
パーミッション600等が使えれば600にしておく。
0180173
02/10/21 18:33ID:nGDYlndqcgi-lib.plの使い方はわかりました。
>>173の
<input type=\"submit\" value=\"管理用\">
この部分でできたボタンを押したことを感知するイベントハンドラ(?)みたいな処理にしないとマズいですよね?
そこを押したらpassを取得して比べるという事をしなければならないので。
そーいったのはどうすればできるのでしょうか?
0181nobodyさん
02/10/21 18:44ID:???> <input type=\"hidden\" name=\"mode\" value=\"admin\">\n
mode が admin な時に実行すれば?
0182nobodyさん
02/10/21 18:53ID:???パーミッション600だと読み込みが出来なくなっちゃうのでダメですよね。
結局見せたくないなら、手っ取り早くcgiファイルにしとけって事ですかね。
プロの人はどうやってるんでしょうか。
0183173
02/10/21 19:09ID:nGDYlndq%form = &read_input('euc');
$iptPass = $form{'pass'};
$mode = $form{'mode'};
if($mode eq admin){
# ---パスワード認証された時の処理
if ($iptPass = $PASS){
(略)
}
# ---パスワードが間違えてた時の処理
else{
(略)
}
}
>>181さんを参考にして、こんな風に付け足ししてみたんですけど、ダメでした。。。・゜・(ノД`)・゜・
もうちょっと詳しく解説して戴けますか?
>パーミッション600だと読み込みが出来なくなっちゃうのでダメですよね。
suexec対応の鯖使え。
共有鯖でsuexecでCGI動かしてない鯖は糞だから見限れ。
>結局見せたくないなら、手っ取り早くcgiファイルにしとけって事ですかね。
・見られたくないファイルはHTTP経由で見れないディレクトリに置く。
・suexecでCGIが動く鯖を使う。
・.htaccessでdenyる。
どれかにしる。
>>183
if ($iptPass = $PASS){
↓
if ($iptPass eq $PASS) {
だべさ。
0186173
02/10/21 19:56ID:nGDYlndqどうもありがとうございます。
でもできないです…。
0187173
02/10/21 20:05ID:nGDYlndqhttp://www.geocities.co.jp/SiliconValley-Sunnyvale/6220/chlog.zip
0188nobodyさん
02/10/21 20:18ID:???http://www.strangeworld.cx/cgi-bin/remix/bbs.cgi?area=soft15
0189nnd
02/10/21 21:51ID:j4V+CWpA$count =1;
$data = "$count" . ".html";
上のように自動に作成された1.htmlというファイルですが、
特定のフォルダ下に自動作成するにはどうしたらいいのでしょうか?
/html/1.html
という様にhtmlというフォルダの下に1.htmlというファイルを
自動的に作る場合はどのように指定してやればよいのでしょうか?
どなたかご教授お願いします。
0190nobodyさん
02/10/21 22:07ID:5oRhJ4R+open(FH,">./html/$count.html");
close(FH);
がむばれ
0191nobodyさん
02/10/21 22:13ID:???キミは決定的な勘違いをしている。
パスワード入力画面を出力したプロセスで
その結果を受け取れるワケがない。
ブラウザ「cgi呼び出し」
↓
CGI「パスワード入力画面出力」
↓
ブラウザ「パスワード入力画面表示」
これで1プロセス。ここでCGIの実行は終了。
この操作と同時に「CGIが吐き出したフォームに書き込まれる内容」を
CGI自身が受け取れるわけがない。
同じCGIの中でパスワードのチェックもしたいなら、
CGIが実行する一番最初の処理に
「パスワード付きの呼び出しが来たらこっちで処理」
という分岐をいれなければダメだ。
0192nobodyさん
02/10/21 22:17ID:???> 結局見せたくないなら、手っ取り早くcgiファイルにしとけって事ですかね。
> プロの人はどうやってるんでしょうか。
プロじゃなくっても、サーバいじれるなら、.datへのアクセスを
禁止しておくのが普通でしょ。
0193nobodyさん
02/10/21 22:26ID:5oRhJ4R+それか、httpでアクセスできないとこに設置するとか。
0194作ってみた
02/10/21 22:34ID:???これじゃだめか?
#!/usr/local/bin/perl
# パスワード
$pass='pass';
# このファイル名
$file='pass.cgi';
read(STDIN,$_,$ENV{'CONTENT_LENGTH'});
foreach (split(/&/)){
($name,$_)=split(/=/);
s/%([a-fA-F0-9][a-fA-F0-9])/pack('C',hex($1))/eg;
$input{$name}=$_;
}
print "Content-tyep:text/html\n\n<html><body>";
if($input{'pass'} ne ''){
if($input{'pass'} eq $pass){
print "本物";
}else{
print "偽者";
}
}else{
print '<form action="'.$file.'" method="POST"><input type="password" name="pass"><input type="submit"></form>';
}
print "</body></html>";
0195189
02/10/21 22:35ID:j4V+CWpA明日試して見ます。すいません。今日はもう寝させてくださいzzz
0197173
02/10/21 23:33ID:nGDYlndq難しい…。
何となく前半はわかったのですが、後半がよくわかりません。
もう少し考えさせてください。m(_ _)m
>>194
わざわざ作っていただいてありがとうございます。m(_ _)m
>print "Content-tyep:text/html\n\n<html><body>";
Content-tyepではなくて、Content-typeですよね?
でも、それを直してうpしても、エラーが出ちゃうんですよね…。(^^;
0198nobodyさん
02/10/22 00:27ID:???しとかないと大変なことになるよね。
パーミッションしっかりしてれば問題ないけど、それなら.cgiにする必要もないし。
0199173
02/10/22 00:29ID:EEwgqraoごめんなさい、エラーが出たのは私めのせいでございました。。。
パーミッションを変えないという初歩的なミスを…。
ちゃんと動きました、ごめんなさい。
敬具
0200nobodyさん
02/10/22 00:54ID:???いろいろな共有鯖で使う尼向け配付にはもってこいの気もする
・・・・・・・・・・なんだ結局尼むけだなぁ
仕事に使ったらAFOってことで
0201nobodyさん
02/10/22 02:35ID:???$_ = reverse($_);1
の1って何でしょう?
0202nobodyさん
02/10/22 02:44ID:???拡張子cgiて定石だけど、あくまでアマの定石ってこと?
でも「簡単に設定できる」というのは重要だと思うけど。
仕事でもそれは変わらないと思うんだけどな。
0205nobodyさん
02/10/22 04:15ID:???「.passwd」みたいに拡張子のみにリネームするのが定石じゃないの?FTPツールとかで。
まぁ鯖によっては置けなかったりFTPツールから見えなかったりするけど。
0206nobodyさん
02/10/22 07:04ID:???また、grep関数の良いところを述べてください。
0208nobodyさん
02/10/22 08:42ID:qoySgddo「拡張子のみ」とか言わないで「ドットファイル」と呼んだほうがかっこいいよ
0209nobodyさん
02/10/22 09:38ID:???http://www.google.co.jp/search?q=map%8A%D6%90%94&ie=Shift_JIS&hl=ja&lr=
http://www.google.co.jp/search?q=grep%8A%D6%90%94&ie=Shift_JIS&hl=ja&btnG=Google+%8C%9F%8D%F5&lr=
0210nobodyさん
02/10/22 11:52ID:???クエリーデータを取得して分解する時のこの行は何をしているんですか。
0211nobodyさん
02/10/22 12:31ID:???209にあるような%8A%D6%90%94という文字を、変換前の日本語や記号に戻してるんだよ。
URLデコードっていうんだよ。
0212nobodyさん
02/10/22 13:14ID:???わかりました。
0213nobodyさん
02/10/22 13:19ID:???open(HTML,"$url") || die "ダメ:$i";
while(<HTML>){
print;
}
close;
これエラーになるんですけどなぜでしょう。
0214nobodyさん
02/10/22 14:00ID:???0219173
02/10/22 17:06ID:1nArfp1iパスワードの部屋、>>194を発展させて作ろうと思ってます。
でも、>>191さんの
>同じCGIの中でパスワードのチェックもしたいなら、
>CGIが実行する一番最初の処理に
>「パスワード付きの呼び出しが来たらこっちで処理」
>という分岐をいれなければダメだ。
という所が理解できないので、サンプルソース戴けませんか?
わからないままってのはこれから困るし…。
どうかよろしくお願いします。m(_ _)m
0221nobodyさん
02/10/22 17:57ID:???教わったところで自分が何を実行してるのかわからないだろうから
こんなとこで「理解」はどのみち無理かと。
0222nobodyさん
02/10/22 18:25ID:???とりあえず、
> 「パスワード付きの呼び出しが来たらこっちで処理」という分岐
に相当する処理を>>194から探してみようよ。
0223nobodyさん
02/10/22 20:21ID:TiLNiSf4なのにどうしてスクリプト内のコメントは全部英語なんですか?
外国人のために英語で書いてあげてるんですか?
でも圧倒的に日本人が使う頻度が高いですよね?
それとも単なるかっこつけですか?
0224iui
02/10/22 20:34ID:qg3kIz94ぜひどなたかおしえ頂きたいのですが・・・
フォームのテキストエリア内での改行についてなのですが、
2CHに書き込みすると改行が生かされていますよね?
これはどのようにするのでしょうか?
WRAPとは違うのですよね?書き込みデータを出力しているときに
<br>が入っているのでしょうか?
面倒な質問ですがどなたかご存知の方いましたらよろしくお願いします。
0225iui
02/10/22 20:34ID:qg3kIz94テキストエリアに書かれた内容をメソッドポストで
write.cgiに送りdata.htmlに出力し、
それをread.cgiで表示しています。
具体的にはこうです。
==write.cgi==
$data = "data.html";
$name=$cgi{'name'}; #POSTで送られてきたデータ
$text=$cgi{'text'}; #POSTで送られてきたデータ
open(FILE, ">>$data") || &error("");
print FILE "<font size=\"2\">$name</font><font size=\"3\">$text</font>";
close(FILE);
==read.cgi==
open(FILE, "<$data") || &error("");
@lines=<FILE>;
close(FILE);
print @lines;
data.htmlを見ても文章に改行コードが入っていないので
改行する訳ないのですが・・・
テキストエリア内での改行コードを<br>に変換???
テキストエリア内の改行コードってどうやってみるの???
などなど、悩んでました。アホな悩みですがよろしくお願いします。
0226マジレスw
02/10/22 20:38ID:???一般的なPerlユーザならあの程度の英語は理解できるからです。
日本人Perlユーザの100人中99人は理解できます。
読めない1人(=223)が減っても、2人ぐらいなら海外から補填出来ます。
結局読める人は計101人で日本語で書くより読めるユーザが増えます。
0227マジレスw
02/10/22 20:45ID:???改行コードが入ってないってのがよく分からんが
-------------------------------------------------------------
$data = "data.html";
$name=$cgi{'name'}; #POSTで送られてきたデータ
$text=$cgi{'text'}; #POSTで送られてきたデータ
$text =~s{\x0D\x0A}{<br>}g;
$text =~s{\x0D}{<br>}g;
$text =~s{\x0A}{<br>}g;
open(FILE, ">>$data") || &error("");
print FILE "<font size=\"2\">$name</font><font size=\"3\">$text</font>";
close(FILE);
-------------------------------------------------------------
他にも<,>,",@とかもエスケープせんと酷い目に合うよ。
0229228
02/10/22 20:51ID:???0230nobodyさん
02/10/22 20:54ID:???文字コードの変換とかもしてなさそうな予感。
0231173
02/10/22 21:19ID:1nArfp1i参考にしようとしました。
kent-webのプチボードの管理モードの部分です。
j-code.plは使ってたけど、&read_inputを使ってなかったので、
&read_inputを使った他のソースが欲しいなって思った所です。
>>222
if($input{'pass'} ne ''){
# ↓ここから
if($input{'pass'} eq $pass){
print "本物";
}else{
print "偽者";
}
# ↑ここまでですよね?
}else{
print '<form action="'.$file.'" method="POST"><input type="password" name="pass"><input type="submit"></form>';
}
0232nobodyさん
02/10/22 21:20ID:???根本的に認識がずれてるからどう説明すればいいかとても悩みますね
ところで>>227の $text =~s{\x0D\x0A}{<br>}g; って初めて見たけど
$text =~s/\x0D\x0A/<br>/g; じゃだめなん
0233iui
02/10/22 21:22ID:nQEHGPbTデコードできてないとの事なのですが、本に載っていたデコードを
そのままやったのでおそらくそれが原因なのでしょうか?
↓のデコードで問題あるのでしょうか?またコノヨウナ半角カタカナも
文字化けしてしまうのはデコードが上手くいってないからでしょうか?
度々すいませんがよろしくお願いします。
sub decode{
$readSize = read(STDIN, $form_data, $ENV{'CONTENT_LENGTH'});
if ( $readSize && ( $readSize != $ENV{'CONTENT_LENGTH'} )){
&error("");
}
@part = split('&', $form_data);
foreach $i (@part) {
($names, $value) = split('=', $i);
$value =~ tr/+/ /;
$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg;
&jcode'convert(*value,$mycode
$value =~ s/&/&/g;
$value =~ s/"/"/g;
$value =~ s/</</g;
$value =~ s/>/>/g;
$value =~ tr/\r\n//d;
$cgi{$names}=$value;
}
}
0234nobodyさん
02/10/22 21:22ID:???環境によってperldocを通らないことがあるからではないですか。
オンラインマニュアルに求められるのは、なるべくどこでも読めることですから。
これから学習して腕を上げていかれるかと思いますが、間違っても>>226のように
人を見下すことしかできない厨房にはならないでくださいね。
0237iui
02/10/22 21:52ID:nQEHGPbT>>236
様、有難うございます。確かにtrされてますね。恥かしい。
すいませんでした。
これを<br>に置換してやって見ようと思います。
あと、もう一つすいませんが、半角カタカナはどのように
すれば文字化けせずに表示できるのでしょうか?
これもデコード処理によるものなのでしょうか?
調べる取っ掛かりになるヒントだけでも良いのでお願いします。
0238nobodyさん
02/10/22 21:58ID:???・ まずjcode.plはあるのかどうか。
・ require 'jcode.pl'; してるのかどうか。
・ $mycode = 'euc(もしくはsjis)'; があるのかどうか。
0239nobodyさん
02/10/22 22:01ID:???<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP(もしくはShift_JIS">
0240nobodyさん
02/10/22 22:05ID:???通常SJISだからそれ以外は投稿できないように(2chはこうなってるはず)
無理にjcodeを使うから文字化けするのでは?
文字コードに関しては無知なのであってるかどうかは分からんが
0241iui
02/10/22 22:15ID:nQEHGPbTjcode.plはあります。
require 'jcode.pl'; も宣言しています。
$mycode = 'sjis'; にしています。
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS>でやっています。
>>240様
するとSjisでないと文字化けするということですか?
テスト書き込みの際はSJISでやったのですが文字化けが起こって
しまいました。
0242240
02/10/22 22:27ID:???言い方が変だったかな?
SJISで半角カナを書き込むと、それがEUCのコードと一致してEUCとみなさえれて文字化けします(たぶん)
だからjcodeの仕様だと文字化けが起こるのはしょうがないと思われ(たぶん)
ということで文字化けを防ぐなら変換しないのがいいと思われ。
さっきからただの勘違いだったらスマソ
0243iui
02/10/22 23:15ID:???とりあえず明日、jcodeを洗って見ようと思います。
もしかしたら明日もまたご厄介になるかもしれませんが
よろしくお願いします。
0245nobodyさん
02/10/23 01:04ID:???0246nobodyさん
02/10/23 01:18ID:???「それとも単なるかっこつけですか?」なんて事書いてる馬鹿に
マジレスしてる時点で、>>234は脳みそがイカレてると思われ。
0247nobodyさん
02/10/23 01:52ID:???> つーか、英語読めずにプログラミングやってるのか…?
こういうこと言う人けっこういるけど
よく聞いてみるとほとんどの奴は和英ソフトとかに頼ってんだよね
実際には単語をちょいちょいくらいしか読めないやつがね、多いね。
0248nobodyさん
02/10/23 02:26ID:???すいません、foreachとかcryptとか
意味すら調べないまま認証制のCGI自作して使ってます。
0251nobodyさん
02/10/23 09:19ID:???foreach, cryptみたいな基本的な単語でさえ、これか… という
感じはあるけど、せめてMLとかできちんとエラーが表示されて
いるのに、「わけのわからないエラーが出て」みたいなやつは
逝ってよいと思う。
0252nobodyさん
02/10/23 10:10ID:???フリーのCGI配布サイトって半分以上がs-jisで書いてますよね。
おそらくそういう人たちが模範的にEUCで書いてくれれば
perlを覚えてみようという人たちも真似てEUCで書くと思うんですよね。
あ、もしかして、フリーのサイトは配布用は初心者が開いて文字化けしてる、と混乱しないように
s-jisで書いてくれてるんですかね。
0253nobodyさん
02/10/23 11:13ID:???LWPでHTTP要求したときに一定時間応答がなかったらタイムアウト
させたいのですが、どうしたらいいですか?
0255nobodyさん
02/10/23 13:22ID:???<input type="checkbox" name="okasi" value="tyoko">チョコ</input>
こうやってチェックボックスがあって、nameが同じ時はどうやって値を取得したらいいですか。
getで引数を確認したら、?okasi=poteti&okasi=tyoko こうでした。
$buffer = $ENV{'QUERY_STRING'};
local(@pairs) = split(/&/,$buffer);
foreach $pair(@pairs){
local($name,$value) = split(/=/,$pair);
$FORM{$name} = $value;
}
@FORM;
これにどんな手を加えればいいんでしょうか。
0257nobodyさん
02/10/23 13:36ID:???やり方はあるけど、>256の言う方が正しい。
0258nobodyさん
02/10/23 13:41ID:???確かにnameを別々のにすればなんの問題も無いんですけど、
普通チェックボックスってグループが同じだとnameは同じですよね?
やり方があるのなら教えて欲しいんですけど。
0259nobodyさん
02/10/23 13:47ID:???無駄に鯖負荷増やすだけだからやめれ。
グループが同じでnameが同じなのはチェックボックスじゃなくてラジオボタン。
0260nobodyさん
02/10/23 13:50ID:???$FORM{$name} .= "\0" if (defined($FORM{$name} )); # \0 is the multiple separator
$FORM{$name} .= $value;
0261x
02/10/23 14:07ID:YR7PdIKr↓ ↓ ↓
http://www.dream-express-web.com/space-trust.htm
0262名無しさん@Emacs
02/10/23 16:28ID:???>>254
つまらん
0263nobodyさん
02/10/23 17:00ID:???すると使える文字数は26文字になります。桁数は6文字です。
最大で26の6乗個=308915776個のIDが使える計算なんですが。(合ってますかね?)
生成されたIDが既に登録されている場合はもう一度生成し直す。
という風に考えていますが何か問題ありますでしょうか。
ちなみにID発行数は約1万個前後くらいだとした場合です。
------------------------
# 候補文字列を定義
@char = ('a'..'z');
# 乱数で種を抽出
srand;
$salt = $char[int(rand(@char))] . $char[int(rand(@char))] . $char[int(rand(@char))] . $char[int(rand(@char))] . $char[int(rand(@char))] . $char[int(rand(@char))];
print "$salt";
0264nobodyさん
02/10/23 17:10ID:???print $char[int(rand(27))] for(0..5);
とりあえずこっちのほうが短いけど改造するとき大変。
0265264
02/10/23 17:18ID:???srand;
print (('a'..'z')[int(rand(27))]) for(0..5);
上のが正解。
でもこれだと出来たIDが保存されないから、するなら
srand;
$salt.=(('a'..'z')[int(rand(27))]) for(0..5);
print $salt;
ていうか>>263は短いソースを求めてるわけじゃないんだけどね・・・
同じのがいくつも出てきたから直したくなってしまったスマソ
0266263
02/10/23 19:42ID:???レスありがとうございます。
流れ的には悪くはないんですよね?
IDを自動発行にしたのは、IDをユーザーが好きなのに決めるタイプだと
重複していた場合「このIDは既に登録されています、別の・・・」
というエラーを出さないといけないからです。
これってユーザーにとっては結構わざらわしいですよね。
高アクセスのサイトとかじゃないと重複する事はあまりないと思いますけど。
だったら自動でID発行した方が良いと思いこのタイプにしました。
て、別に説明するまでもないと思うんですが・・・。
0267nobodyさん
02/10/23 19:48ID:???0269253
02/10/23 20:14ID:???自己レス。
>LWPでHTTP要求したときに一定時間応答がなかったらタイムアウト
>させたいのですが、どうしたらいいですか?
$ua->timeout([$secs])
秒単位でタイムアウト(timeout)を取得/設定します。
デフォルトのtimeout()の値は180秒、つまり3分です。
ちょっと調べたらすぐ出てきました。ごめんなさい。
0270263
02/10/23 20:22ID:???いえ、別にいいと言えばいいですが、、、
でも普通の会員サイトでIDを自動でくれるとこは連番とかで出してるとこ少ないですよね・・・。
なんででしょう。。
>>268
はい、そうです。すみませんでした。
自分で考えてやってたので不安でしたので。
携帯向けと仮定しているので、数字や英字の小文字、大文字が混じると
IDの入力が面倒だと思って英小文字に限定したりするのは自分で決めたんですが、
あんまりそうやってるとこ無くていいのか確かめたかったんです。
0271iui
02/10/23 20:40ID:GY8eUNRB昨日皆様のご教授によりフォーム内の改行は解決しました。
デコードで改行コードを排除していたのが原因でした。
しかし、半角カタカナの問題が解決できません。
素直にEUCつかえば・・・もっともですが、やはりここまで
悩んだのならSJISで行きたいのです。勝手な思い込みで申し訳有りません。
先日も述べたように全てのソースにsjisを指定しております。
しかし上手く行きません(ンパ=>保狂になる・・・)
2CHはいったいどのような処理をしているのでしょうか?
すべてsjisで処理しているようですが、なぜ文字化けしないのでしょう?
jcode.plの違いなのでしょうか?デコードの問題なのでしょうか?
サイト巡りをしていると「表示」というのも文字化けする
との事ですが、これは文字化けしませんでした。
これはjcode.plが進化したという事なのでしょうか?
なんか取り留めのない質問ですがよろしくお願いします。
■ このスレッドは過去ログ倉庫に格納されています