トップページphp
1001コメント360KB

Perlコーディング初心者質問スレ Part 52

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2006/09/15(金) 14:01:51ID:gobry0n2
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

お勧めサイトは >>2-10

前スレ http://pc8.2ch.net/test/read.cgi/php/1153987463/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0182nobodyさん2006/10/01(日) 18:08:31ID:???
>>181
「カラー」が「color」ならうまくいきません?
それでうまくいったら文字コードの関係でしょう。
0183nobodyさん2006/10/01(日) 20:28:54ID:???
$color = quotemeta $color;
あるいは
$line =~ s/\Q$color\E/xxxxx/;
0184nobodyさん2006/10/01(日) 21:19:06ID:???
俺も初心者だけど。。。

Shift-JISだと、”ー”の第2バイトが”[”ってことかな〜?
後々の事を考えると、EUCかUTF-8がいいかもね。

use encoding "shiftjis";
0185nobodyさん2006/10/01(日) 21:56:19ID:???
use encoding なんか薦めないでくれwww
0186nobodyさん2006/10/01(日) 21:57:04ID:???
>>184
初心者に不用意に encoding.pm を教えるなよ。
0187nobodyさん2006/10/01(日) 22:17:27ID:???
encoding って負の遺産だろ・・・
0188nobodyさん2006/10/01(日) 22:32:53ID:???
さんざんでわろたw
01891782006/10/01(日) 22:43:04ID:???
みなさんアドバイスありがとうございます。
ということは>>183さんのやり方がいいのでしょうか?
明日試してみます。ありがとうございました。
01901632006/10/02(月) 00:08:50ID:???
>>177
遅れましたがレスありがd
ちょっと調べたんですが、Windows版のApache1.3用mod_encodingって
もしかして無いんでしょうか?

自分でビルドするしかないって事になるのでしょうか

あ、自宅サバ行った方がいいかな
0191nobodyさん2006/10/02(月) 18:06:42ID:NJMhk9xt
ASCIIコードを文字に変換するのってどうすんの?
"\x20"→" "みたいな感じ
0192nobodyさん2006/10/02(月) 18:12:31ID:???
perl -e 'print +( chr( "¥x20")) . "¥n"'
0193nobodyさん2006/10/02(月) 18:14:51ID:???
おおまちがい orz...
0194nobodyさん2006/10/02(月) 18:54:08ID:???
ハッシュのアドレスを使ってそのアドレス先のハッシュのキーを取り出すことは可能ですか?
$ref_hashがハッシュのリファレンスだとすると
keysはハッシュしか受け付けてくれないので、
$ref_hashからハッシュを復元(?)してkeysで取り出したりできないだろうかと
思っているのですが
0195nobodyさん2006/10/02(月) 18:56:59ID:???
01961942006/10/02(月) 19:03:04ID:???
あるハッシュへのアドレスがあって、そのアドレスが$ref_hashです。
それで、そのハッシュのキー値がしりたいのですが、
無名ハッシュなので、なんとかしてアドレスからわからないだろうかと・・・
0197nobodyさん2006/10/02(月) 19:15:47ID:????BRZ(1100)
デリファレンスってどうやんだっけ?
0198nobodyさん2006/10/02(月) 19:26:18ID:???
$ref_hashがハッシュのリファレンスなら

keys %$ref_hash

だがアドレスといっているので何か違う世界の話かもしれないな...



0199nobodyさん2006/10/02(月) 19:41:16ID:???
リファレンスを文字列にすると、"型(アドレス)" が得られるけど、このアドレスの事?
perl -e "print [123];" → ARRAY(0x123456)


まあリファレンスの事だろうけど
0200nobodyさん2006/10/02(月) 19:46:10ID:???
encoding って使うとまずのですか?
02011942006/10/02(月) 20:01:46ID:???
いやリファレンスのことです。。。
すみません、ありがとうございました。
0202nobodyさん2006/10/02(月) 21:02:26ID:???
>>200
まずくありません。よく知られた罠があり、使う場面を選ぶというだけです。しかしそのため、

「よくわからないけれどとにかく動くようにしたい人」に勧めると、二日ほど経ってから「今度は思わぬところがアッー! で困っています」と泣き付かれるかもしれず、
「プログラムやライブラリを配布して社会に貢献したい人」に勧めると、膨大な数の配布先が use encoding の罠に汚染されてしまうかもしれず、
「夢と希望と探究心に溢れた初心者」に勧めると、貴重な学習曲線の序盤でつまらない無駄足を踏ませてしまうかもしれず、

などの事情で大抵は勧めにくいということです。
適切な使いどころがわからないなら使わないほうが無難でしょう。
0203nobodyさん2006/10/02(月) 21:30:58ID:kJiDkda9
すみません、他スレから誘導されてきました。

ホスト名が検索できない海外の串からのアクセスが多くて困っています。
そこでそのようなアクセスを弾くようにするにはどのような手を加えたらよいでしょうか?
良く見かける言葉では
・ホスト名が無い時に弾く
・逆引きできないホストからのアクセス禁止
のようになるとおもいます。

難しい事は分からないので出来るだけ簡単に何かないでしょうか?
よろしくお願いします。
0204nobodyさん2006/10/02(月) 22:16:03ID:???
>>202
ありがとう。
よく知られた罠とは何でしょうか?
少しググって見ましたが、こんな感じのやつしょうか?

Allen's diary(2005-04)
http://www.tokimeki.st/diary/?date=200504

Perlで何だか妙なエラーが出て悩まされた件について。
具体的には、"Wide character in subroutine entry"って何やねんっ!と悩んでたけど、
よくよく考えたら

use encoding "shift-jis"してるから標準入力から取り込んだ文字列は既にUnicodeに
なってるというのに、わざわざEncode::from_to($str, "shiftjis", "euc-jp");とかやってた

複数ファイルへのリダイレクトのために標準出力を一旦閉じて開きなおす際に文字コードを
指定しなおしてなかった(出力はeuc-jpだけど、use encoding "shift-jis", STDOUT=>'euc-jp';で
満足してた)という二重障害が原因と判明。慣れないことをするからこんな恥ずかしいバグが
出るんだよ_| ̄|○
0205nobodyさん2006/10/02(月) 22:33:23ID:???
>>203
それは 「自分ではperlコードなんか作りたくないけど、どこかそういうコードを配布してるところを知りませんか?」 ってこと?

自分でやるなら、$ENV{REMOTE_ADDR} と $ENV{REMOTE_HOST} 、
それに gethostbyaddr や gethostbyname でぐぐってみていろいろ自分で考えて、
それでもわからなかったら聞きにおいで。

>>204
そのひと、いろんな意味で何やってるのかわからんねw
0206nobodyさん2006/10/02(月) 22:37:55ID:???
>>204
概ねそれです。しかし実際にはもっと大きな罠です。
「use encoding の効果は use encoding されたプロセスの I/O 全てに効いてくる」というのがその理由です。
つまり自分だけでなく、他人の書いたコードの "use encoding" safe を気にしなければなりません。
use や require で読込まれたコードがそれっぽい処理をしているとアウトですから。

そんなのイヤでしょ?
0207nobodyさん2006/10/02(月) 22:50:41ID:???
>>206
ああ、なるほど。
納得しました。
サンクスです。
02082032006/10/02(月) 23:49:15ID:???
>>205
>それは 「自分ではperlコードなんか作りたくないけど、どこかそういうコードを配布してるところを知りませんか?」 ってこと?
配布している所があれば是非活用したいですのでもしあれば教えていただけませんか?
0209nobodyさん2006/10/03(火) 00:37:08ID:???
>>208
スレ違いなのでどちらかへ ∩( ´∀`)∩ドウゾ (っ´∀`)っ))ヨロシク

【CGI】こんなCGI探してますver.21
http://pc8.2ch.net/test/read.cgi/hp/1154177468/

ご希望のCGIを作成いたします
http://pc8.2ch.net/test/read.cgi/php/1145308869/
0210nobodyさん2006/10/04(水) 12:12:04ID:zNjB8ynb
どうにもうまく行かないバグが発生しており、自分では原因が分からないところまで来てしまったので質問させて下さい。
自分のはてなブックマークからRSSを取得して、ブックマークしているURLを抽出→そのURL(合計30件)をブックマークしている全てのユーザーを抽出→上位を表示というスクリプトを組んだのですが特定のURLからユーザー情報を抽出出来ないバグが発生しています。
少し長いのですが以下にコードを載せます。
0211nobodyさん2006/10/04(水) 12:13:19ID:zNjB8ynb
#!/usr/bin/perl

use LWP::Simple;

$base = get('http://b.hatena.ne.jp/Marathon/
rss'); #ここのMarathon部分を自分のユーザーIDに変更
@splited_base = split /\n/, $base;

foreach $i (@splited_base) {
if ($i =~ m|a href="http://
b.hatena.ne.jp/entry/(.+?)"|) {
$data = get('http://
b.hatena.ne.jp/entry/rss/'.$1);
push(@splited_rss, split /
\n/, $data);
}
}
#続く
0212nobodyさん2006/10/04(水) 12:14:47ID:zNjB8ynb
#続き
foreach $i (@splited_rss) {
if ($i =~ m|<title>([a-zA-Z0-9].*[a-zA-
Z0-9])</title>|) {
push (@fav_user_list, $1);
}
}

foreach $i (sort { $a cmp $b } @fav_user_list) {
if ($i eq $prev) {
$per++;
} else {
push (@sorted_favlist,
($per*3.33)."%\t$prev");
$prev = $i;
$per = 1;
}
}

push (@sorted_favlist, ($per*3.33)."%\t$prev");

foreach $i (sort { $b <=> $a } @sorted_favlist) {
print "$i\n";
if ($j == 10) {
last;
} else {
$j++;
}
}
exit;
0213210-2122006/10/04(水) 12:20:38ID:t51HyLJW
何故か>>211-212に挙げたスクリプトでは

http://b.hatena.ne.jp/entry/rss/http://capsctrl.que.jp/kdmsnr/wiki/bliki/?cmd=view&p=UmlAsSketch&key=%A5%B9%A5%B1%A5%C3%A5%C1

に含まれている、<title>ユーザーID</title>の情報が抽出出来ないのです。

上のURLは自分のブックマークのRSSか正常に抽出されたもので、個別にget()してから<title>ユーザーID</title>の抽出を行うと問題なくユーザーIDの抽出が行えます。

現状、個別に抽出出来る状態にも関わらず、それをループさせると問題が出るという状況に陥っています。

原因がお分かりになる方、ご助言頂ければ幸いです。
0214nobodyさん2006/10/04(水) 12:56:10ID:???
>個別に抽出出来る状態にも関わらず、それをループさせると問題が出る

じゃあループに問題があるのでは?
読んでないけどww
0215nobodyさん2006/10/04(水) 13:59:04ID:???
これだけ長いといちいち追いかける気もしないので、途中結果を確認して
おかしい所を特定してから示してくれ。
0216nobodyさん2006/10/04(水) 16:14:40ID:mTQmplV+
>>214-215
恐らく↓のルーチンでget出来ていないか
foreach $i (@splited_base) {
if ($i =~ m|a href="http://
b.hatena.ne.jp/entry/(.+?)"|) {
$data = get('http://
b.hatena.ne.jp/entry/rss/'.$1);
push(@splited_rss, split /
\n/, $data);
}
}

↓のルーチンで抽出が出来ていないか
foreach $i (@splited_rss) {
if ($i =~ m|<title>([a-zA-Z0-9].*[a-zA-
Z0-9])</title>|) {
push (@fav_user_list, $1);
}
}
のどちらかが問題だと考えています
0217nobodyさん2006/10/04(水) 16:18:48ID:???
ただ、上のルーチンで応答コードを返させると全て200が返ってくるので連続取得で弾かれてる線は薄いんじゃないかんと自分では考えています。

下のルーチンは問題の有るURLを個別にgetしてから入れると問題なくユーザーIDを抽出してきます。

そうすると、上のルーチンも下のルーチンも正常に動作していることになり、原因が存在しないことになってしまっているのが現状です

長いコードを貼り付けて申し訳ありませんでした。
0218nobodyさん2006/10/04(水) 16:51:57ID:???
だからお前がどう勝手に思い込んでるかはどうでもよくて、、変数の値が期待してる通りになってるか
ちゃんと表示させて追いかけろと....
0219nobodyさん2006/10/04(水) 18:01:45ID:8AfjfVrQ
>>218
試してみます
ありがとうございました
0220nobodyさん2006/10/04(水) 18:53:53ID:XYwup9WL
素人:perlってどうやってデバッグやんの

プロ:間接的には可能ですが厳密なデバッグはできません。仕様外です。w
0221nobodyさん2006/10/04(水) 20:30:23ID:???
わざわざスクレイピングせずに XML::RSS とかCPANモジュール使えば?

#!/usr/bin/perl
use LWP::Simple;
use XML::RSS;

my $hatena_id = "Marathon";

my $rss = new XML::RSS;
$rss->parse( get("http://b.hatena.ne.jp/$hatena_id/rss";) );
my $items = $rss->{items};

my %count;
for my $item (@$items) {
  my $item_rss = new XML::RSS;
  $item_rss->parse( get("http://b.hatena.ne.jp/entry/rss/$item->;{link}") );
  $count{ $_->{title} }++ for (@{ $item_rss->{items} });
}

my @ranking = sort { $count{$b} <=> $count{$a} } keys %count;
for my $user (splice @ranking, 0, 10) {
  my $per = $count{$user} / @$items * 100;
  printf "%.2f%%\t%s\n", $per, $user;
}
02221782006/10/04(水) 20:49:29ID:???
正規表現で変数を使う際に、その変数の中に長音記号が入っている場合
についてお聞きします。
作っているCGIの内容というのは
入力画面→確認画面→登録完了画面という流れになっています。

入力画面ではラジオボタンで参加したいセミナーを選択します。
<INPUT type="radio" name="xxx" value="セミナー1">
<INPUT type="radio" name="xxx" value="セミナー2">
というようになっています。

そして確認画面に<!--xxx-->と記述しておき
valueの値と置換して選択したセミナーを表示するという処理を
行いたいのです。

CGIに下の記述をしています。

$seminar1 = "セミナー1";
$seminar2 = "セミナー2";

$seminar1 = quotemeta($seminar1);
$seminar2 = quotemeta($seminar2);

quotemetaを行っているので
value="\セ\ソ~\ナ\―[\2"
というふうになってしまい、

確認画面に「セミナー2」と表示できずに
「\セ\ソ~\ナ\―[\2」と表示されてしまいます。

何かいい方法ありませんでしょうか?

わかりづらかったらすみません。
0223nobodyさん2006/10/04(水) 20:56:06ID:???
>>222
/\Q$seminar1\E/ とすれば quotemeta は必要ない

生で表示すると、パラメータとして xxx=<script>alert("Hello")</script> を渡したりしても大丈夫?
てか、テンプレートエンジン使おうよ...
02241782006/10/04(水) 21:02:53ID:???
>>223
アドバイスありがとうございます。
テンプレートエンジンて初めて聞きました。。
勉強してみます。
ありがとうございました。
0225nobodyさん2006/10/04(水) 21:30:47ID:???
>>221 だとURL中の # がエスケープされなくてだめだね 直したら 100% になった

my %count;
for my $item (@$items) {
  my $item_rss = new XML::RSS;
  (my $item_link = $item->{link}) =~ s|([^\w:/.])| '%' . unpack('H2', $1) |eg;
  $item_rss->parse( get("http://b.hatena.ne.jp/entry/rss/$item_link";) );
  $count{ $_->{title} }++ for (@{ $item_rss->{items} });
}
0226nobodyさん2006/10/04(水) 23:15:47ID:1QuMr0io
>>221,225
助言有り難うございます!
&、#絡みの問題であることが把握出来ました
モジュールをLWPしか使用していないのは、公開を前提に組んでいたので少しでも動作を軽くしようと考えて正規表現をしようしてのが理由です。
XML::RSSを使用すると処理が重くなっていたので・・・
0227nobodyさん2006/10/05(木) 04:08:05ID:???
(`-´).。oO(そういえば<title lang="ja">ってゆータグではまったことあったっけ…)
0228nobodyさん2006/10/05(木) 04:28:28ID:???
>>226
XML::LibXMLでXPath試してみれば?
0229nobodyさん2006/10/05(木) 05:21:07ID:2/YXra1Q
初めまして 質問させていただきます


$contentの中に相当な長さの文字列が入っていたとします。
この中に


http://〜(なんでも)〜.jpgや
http://〜(なんでも)〜.gifや
http://〜(なんでも)〜.pngや
ttp://〜(なんでも)〜.jpgや
ttp://〜(なんでも)〜.gifや
ttp://〜(なんでも)〜.pngや
http://pita.stで始まるアドレスや
http://imepita.jpで始まるアドレスや
http://pic.toで始まるアドレス


のアドレス部分だけを引き抜いて$OUTPUTに入れていって

http://〜(なんでも)〜.jpg
http://〜(なんでも)〜.gif
http://〜(なんでも)〜.png


といった具合に各行ごとに出力するにはどうコードを書けばいいですか?
02302292006/10/05(木) 06:14:01ID:???
VIPからきますた
0231nobodyさん2006/10/05(木) 06:20:48ID:???
それくらいググればいくらでも出てくる
0232nobodyさん2006/10/05(木) 11:24:12ID:???
print "http://$1\n" while $content =~ m[h?ttp://([[:ascii:]]+?\.(jpg|gif|png))]g;
0233nobodyさん2006/10/05(木) 11:44:39ID:???
>>229
おまえmixiで同じ質問しただろ^^;
0234nobodyさん2006/10/05(木) 14:27:16ID:ei8slwkX
質問させて頂きます、
$CGI->radio_group(-name=>'radiotest',-values=>['val1','val2','val3','val4'])
をヒアドキュメント内に直接(的に)展開したくて

#!/usr/local/bin/perl
use CGI;
print "Content-Type: text/html;\n\n";
$CGI=new CGI;
print $CGI->radio_group(-name=>'radiotest',-values=>['val1','val2','val3','val4']).'<hr>';
print $CGI->popup_menu(-name=>'poptest',-values=>['val1','val2','val3','val4']).'<hr>';
print <<"EOF";
$CGI->radio_group(-name=>'radiotest',-values=>['val1','val2','val3','val4'])<hr>
${\$CGI->radio_group(-name=>'radiotest',-values=>['val1','val2','val3','val4'])}<hr>
$CGI->popup_menu(-name=>'poptest',-values=>['val1','val2','val3','val4'])<hr>
${\$CGI->popup_menu(-name=>'poptest',-values=>['val1','val2','val3','val4'])}<hr>
EOF

な感じでやってみたところ
${\$CGI->radio_group(-name=>'radiotest',-values=>['val1','val2','val3','val4'])}
の部分がうまく展開されません。
この理由、または別の解法をご存知の方はぜひ回答をお願いします。
0235nobodyさん2006/10/05(木) 15:47:13ID:???
>>234
<q cite="http://perldoc.jp/docs/modules/CGI.pm-2.89/CGI.pod";>
radio_group()により返される値は実際にはボタン要素の配列です。
</q>

@{[ $CGI->radio_group(...) ]}
02362342006/10/05(木) 17:10:48ID:ei8slwkX
>>235
あ、しまった、コンテキスト・・・
ありがとうございました!
0237nobodyさん2006/10/06(金) 10:59:57ID:tVeHJJaR
$dataの中に

dwdewdjewd
dewewd
dwedrgv
wdcsdc

といった具合に文字列がたくさん入ってて
一番最後の下の行だけ削除したいときは
どうすればいいですか
0238nobodyさん2006/10/06(金) 11:13:57ID:???

$data=~ s/.+$//;
02392382006/10/06(金) 11:16:22ID:???
chomp($data);
$data=~ s/.+\z//;
0240nobodyさん2006/10/06(金) 11:26:07ID:tVeHJJaR
>>238>>239
ありがとう
どっちがいいの?結果はどっちも同じ?
02412382006/10/06(金) 11:47:58ID:???
$data=~ s/.+\n?\z//;
これがいいかもね
0242nobodyさん2006/10/06(金) 12:02:34ID:tVeHJJaR
>>241
どうしてですか?上の2つとどう違うの?
0243nobodyさん2006/10/06(金) 12:53:58ID:???
>242
なんでそれぐらい自分で調べないんだ?
0244nobodyさん2006/10/06(金) 19:14:14ID:PWke1HN3
どなたか、お願いします。
下のようなフレームを使ったページでA,B,Cそれぞれに
A-abcd.cgi
B-bcde.cgi
C-cdef.cgi
が動いてます。Bのフォームから送信ボタンを押したときに、Cのcgiにデータを送ろうと
色々と検索し、試したのですがうまくいきません。
  ┌───────┐ Bにはラジオボタン数個あり、送信が押されると
  │A            │ 選択された値をCで受け取り処理するようにした
  ├──┬────┤ いのです。最初はactionでCのcdef.cgiを指定したら
  │B  │C       │ Bの枠にcdef.cgiが展開されてww(当たり前でした)
  │    │        │
  └──┴────┘ お願いします。
0245nobodyさん2006/10/06(金) 19:54:33ID:???
>>244
フレームやめろ
0246nobodyさん2006/10/06(金) 19:55:49ID:???
試してないけど、targetでCのフレームを指定してあげれば良いんじゃね?
0247nobodyさん2006/10/06(金) 20:26:54ID:???
perl関係ないじゃん
他所行けよ
0248nobodyさん2006/10/06(金) 20:39:09ID:???
フレームが廃止の方向とあったのでやめることにした。
>>247
お前には聞いてないww
0249nobodyさん2006/10/06(金) 20:48:17ID:???
これはHTMLの話なので確かにここでは板違い。

<form action="cdef.cgi" method="post/get" target="C">
(略)
</form>

で正解だとして、今後はWeb制作板の方に行きなさい。
0250nobodyさん2006/10/06(金) 21:08:45ID:???
もうこねーよwwwwwwww
0251nobodyさん2006/10/06(金) 23:44:30ID:1oLHpAqB
スレ違いだったらすみません
CGIで画像を表示させてるんですが、CGI設置してるサーバーとは別のサーバーに
アップロードしている画像を表示させようとしたらPCとVodafoneのみ画像が
表示されなくて・・・なぜでしょうか?

for($i = 1; $i < 画像枚数; $i++){
print "<img src=http://〜/$i.jpg>";
}

こんな感じで連番画像を表示させてます
0252nobodyさん2006/10/07(土) 00:44:13ID:???
表示できる環境があるというのであれば
タグの書き方やファイルのパスに問題はなさそうだが…

その中の適当な一枚だけを表示するHTMLを吐くようなCGIを試しに設置してみそ。
こんなやつ。

print "Content-type: text/html\n\n";
print "<html><body>\n";
print "<img src=\"http://画像のパス.jpg\">\n";
print "</body></html>\n";
exit;
0253nobodyさん2006/10/07(土) 08:20:28ID:582rzz9a
すみません、教えてください。

キーワード検索式でパターンマッチをperlにて組んでいます。
入力ボックスからしかインプットは受け付けないのですが

PERLソースの中身が見れた!、ソースきたねぇwww
って言う人がいます。
これってホラなんですか?それともPERLのソースの中身を見ることって
可能なんですか???
初心者過ぎて、ごめんなさい。
0254nobodyさん2006/10/07(土) 08:25:25ID:???
>>253
if your code has weak point, that's possible.
0255nobodyさん2006/10/07(土) 08:26:01ID:582rzz9a
>>254
ほんとに!??!?
具体的にいうと、入力された変数の部分にコマンド打たれるんですか?
0256nobodyさん2006/10/07(土) 08:34:03ID:???
>>255
yes.

> キーワード検索式でパターンマッチをperlにて組んで

this can be a weak point.
use quotemeta function.
0257nobodyさん2006/10/07(土) 08:39:53ID:582rzz9a
簡単に言えば読み込んでいる INPUTに関しては
すべて処理を施さないといけないってことですか?

他にもFORMからのINPUTで入れてるのがあるんですが

キーワード検索のみ

$in{'keyword'} =~ s/,/、/g;
$in{'keyword'} =~ s/</</g;
$in{'keyword'} =~ s/>/>/g;
$in{'keyword'} =~ s/\r\n/<br>/g; # Windows系(\r\n)
$in{'keyword'} =~ s/\r/<br>/g; # Mac系(\r)
$in{'keyword'} =~ s/\n/<br>/g;
$in{'keyword'} =~ s/\n/<br>/g;
$in{'keyword'} =~ s/&/&/g;
$in{'keyword'} =~ s/\|//g;

ってしてます
0258nobodyさん2006/10/07(土) 08:57:59ID:???
キーワード検索以外にも入力あるんならそっちが悪いかもしれないしね。
きちんと注意して書けばそうめったにやられるものではないが。
0259nobodyさん2006/10/07(土) 08:59:20ID:???
quotemeta しないとまずハックされると思うねえ
0260nobodyさん2006/10/07(土) 09:11:29ID:???
ただのマッチならuse re 'eval'してなけりゃ大丈夫だろ。
問題は他のところにありそうな気がする
0261nobodyさん2006/10/07(土) 09:13:52ID:???
鯖が不安定で、PerlがCGIとして扱われずソースが流れるとか。
0262nobodyさん2006/10/07(土) 09:15:02ID:582rzz9a
みなさん、親身に相談にのってくれて、ありがとう T_T


もう既にハックされたかも。。。
なんかソースを見たって言われてるんです。

とりあえず>>257の keywordは検索入力ボックスからの受付ですが
その他にいろんな変数をクリックで選ばせて読み込ませています。

ちなみにGETでFORMデータは取得しています。


>>257の表記を全ての変数にかませば大丈夫ですか?
もしかしたらURLで

cgi?size=○○○ ←のような部分にコマンド打たれたのかも・・・
0263nobodyさん2006/10/07(土) 10:09:38ID:???
ソース見れるってのは、どっちかっていうとサーバーの設定の問題じゃないの?
CGIが実行されずにテキストとして送られてるわけなんだから。

他には、パラメータでファイル名を受け取って、その内容を加工して表示したりするCGIに
好きなファイル名を渡せちゃう、みたいな脆弱性も考えられる。
0264nobodyさん2006/10/07(土) 10:48:31ID:???
>>252
そのやり方だと表示されました・・・
0265nobodyさん2006/10/07(土) 10:50:01ID:???
>>252
あっ
一回目は表示されましたがリロードしたら表示されなくなりました
0266nobodyさん2006/10/07(土) 10:58:54ID:582rzz9a
>>263
ちがうんです。CGIは問題なく動いてますし
エラーが出たことも、いまのところまだないです。

またエラーがでたとしても、この鯖はエラーが表示されないで
他のエラーページに転送されるようになっていますよ。


>他には、パラメータでファイル名を受け取って、その内容を加工して表示したりするCGIに
>好きなファイル名を渡せちゃう、みたいな脆弱性も考えられる。
そんなことできるんですか?パラメーターには>>257みたいな
クォートメタは使わないで受信しています
0267nobodyさん2006/10/07(土) 12:00:38ID:???
>>266
>>257 のコードによって安全性が得られると考えているなら、それは間違いです。
Perl の組込関数 quotemeta()、文字列に対する \Q エスケープ、そして CGI における外部データの安全な取扱、及び関連するモジュールについて調べましょう。

CGI で運用されるコードは一般にあらゆる (都合の悪い) 入力に備えておく必要があります。
なぜならそれは、そこにアクセスできる全ての人によって実行可能なプログラムだからです (あなたはそのようにパーミッションを設定したはずです。忘れたとは言わせませんよ?)。
0268nobodyさん2006/10/07(土) 12:15:43ID:???
>>266
mixiだってCGIが実行されずにソースが表示されちゃったからねぇ〜
0269nobodyさん2006/10/07(土) 12:18:01ID:???
昔々だと
http://〜〜.cgi/
のように最後にスラッシュを入れたらソースが表示されたアホな鯖があったねぇ〜
0270nobodyさん2006/10/07(土) 12:25:11ID:582rzz9a
quotemeta調べてるのですが難しいですね。
要するにquotemetaをしないと、入力されたパラメーターとかキーワードは
取り入れちゃいけないのですね
0271nobodyさん2006/10/07(土) 12:31:33ID:???
PerlのCGIは最低限汚染チェック(-t とか -T とか)を有効にしたほうが...

#!/usr/local/bin/perl -T
0272nobodyさん2006/10/07(土) 12:34:38ID:???
>>271
そんなの初めて知った
どういう効果があるんですか?
0273nobodyさん2006/10/07(土) 12:47:57ID:???
>>272
人に尋ねる前に調べる癖をつけましょうよ。
「Perl 汚染チェック」で検索すれば、解説しているページが山ほどでてきます。

簡単に言えば、外部からの入力が「汚染されているもの」という前提で
そのまま表示されていたり、正規表現に埋め込まれていたりしないか
チェックしてくれるオプションです。
(もちろん、機械的なチェックなので、頼りすぎるのは危険です)
0274nobodyさん2006/10/07(土) 12:51:19ID:???
いくら汚染チェックしてもめんどくさいから/(.*)/なんてやって
汚染はずしてたら意味ないけど、まじめに使えばうっかりミスは
かなり防げる。オススメ。
0275nobodyさん2006/10/07(土) 13:52:56ID:???
mixiはPerlだがCGIではない
0276nobodyさん2006/10/07(土) 14:12:12ID:???
何言ってんだこいつ(´・ω・) ・・・>>275
0277nobodyさん2006/10/07(土) 14:17:31ID:582rzz9a
はじめまして


目的のURL $url を使って
URL先の拡張子を取得する方法ってありますか?

また拡張子はrarとかになってても、実際クリックするとphpページ経由して
ダウンロードしろとかありますが、それにも対応できるのでしょうか?
0278nobodyさん2006/10/07(土) 14:22:31ID:???
>>268
どうやったらそんなことできるん?
0279nobodyさん2006/10/07(土) 14:24:33ID:???
>>276
mod_perlも知らんのか
>>277
>URL先の拡張子
意味がわからん
>対応できるのでしょうか
できます
0280nobodyさん2006/10/07(土) 14:24:33ID:???
>>277
日本語でおk
0281nobodyさん2006/10/07(土) 14:26:30ID:???
>>279
ちげえ。
そんなこと聞いてないのに知った風な口ぶりで
「mixiはPerlだがCGIではない (キリ+)」
とか得意げに言ってるから逆に恥ずかしいんだよw
■ このスレッドは過去ログ倉庫に格納されています