Perlコーディング初心者質問スレ Part 52
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2006/09/15(金) 14:01:51ID:gobry0n2【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
お勧めサイトは >>2-10
前スレ http://pc8.2ch.net/test/read.cgi/php/1153987463/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0302nobodyさん
2006/10/07(土) 21:52:15ID:???<form action=get.cgi target=_blank method=post>
・・・・としてフォームに入力された情報を確認画面を表示させるCGIに送っています。
0303nobodyさん
2006/10/07(土) 21:59:18ID:???0304nobodyさん
2006/10/07(土) 22:11:28ID:???使うことになるユーザの行く末が不安だ。
0306300
2006/10/07(土) 22:28:14ID:???教えてくれてありがとうございました。うっかり危険なミスをしてしまうところでした。
いったいどうしたらよいのでしょうか・・・。
0307nobodyさん
2006/10/07(土) 22:45:49ID:???既にわかっている人に作ってもらうかどっちかじゃないか。
0308300
2006/10/07(土) 23:04:15ID:???ありがとうございました。
0309nobodyさん
2006/10/07(土) 23:35:19ID:???hiddenでやって確認用にメール送信でもしておけばそれで良いと思うんだけど…。
0310nobodyさん
2006/10/07(土) 23:43:40ID:???0311300
2006/10/07(土) 23:49:32ID:???仕組みを知らないで使うのはちょっと・・・。
どこのサイトで紹介されてるのもform actionでinput type = text やらばっかりで・・・。
hiddenもダメらしいしなあ・・・。
0312nobodyさん
2006/10/07(土) 23:58:32ID:???0314nobodyさん
2006/10/08(日) 00:03:20ID:???0315300
2006/10/08(日) 00:06:51ID:???ttp://www.techmatrix.co.jp/products/security/watchfire/w_attackofappli/attack2_hidden.html
などhiddenは危険だと云われているようで・・・。
0316nobodyさん
2006/10/08(日) 00:11:38ID:???リクエストを変なのに書き換えられても注文完了画面を出すCGIで変なリクエスト弾けばいいだけだじゃないのか?
0318nobodyさん
2006/10/08(日) 00:17:01ID:???相手サーバに負荷ってどのくらいかかるものですか?
0319nobodyさん
2006/10/08(日) 00:20:26ID:???特定部分の文字列ってのがよくわからないけどHTMLだとすると
画像とか取得しない分ブラウザでアクセスするより負荷は小さい
複数回同じページを取得するような場合はキャッシュを使うことでさらに負荷が小さくなる
0320nobodyさん
2006/10/08(日) 00:22:55ID:???0321nobodyさん
2006/10/08(日) 00:23:46ID:???2個目で吹いた。
hiddenが『何故』危険と言われているのかをちゃんと理解しようね。
>>318
相手サイトの特定部分とやらを含む全てのファイルを
普通のブラウザで読み込みに行くくらいかかると思いねえ。
0322319
2006/10/08(日) 00:24:42ID:???特定部分の文字列ってのの開始位置がわかっているなら
レジューム(対応してない鯖もあるし対応しててもCGIとかだと無理)を使うとさらに負荷を小さくできる(かもしれない)
0323318
2006/10/08(日) 00:25:33ID:???0324nobodyさん
2006/10/08(日) 00:26:41ID:???モジュールは知らんが簡単に書けると思うぞ。
if (ディレクトリ無い) {
ディレクトリつくーる;
bar.txtつくーる;
}
要はこれだけでしょ?
0325318
2006/10/08(日) 00:27:27ID:???2000以上もの用語集サイトを作って、それのデザインを頼まれまして。
2000以上のページにアクセスしたからこそ用語集が作れるわけで
そんときの負荷ってどんなもんだったのかなあ・・・と思い、質問しましたです。
0326nobodyさん
2006/10/08(日) 00:38:49ID:???自分の手にかかればどっちも糞のような気がしますが、どうなんでしょ?
0327300
2006/10/08(日) 00:41:15ID:???値段が改ざんされるから危険なのか。ただのフォームなら変な文字列にすることぐらいしか出来ないか。
個人情報を扱うから漏洩させてしまいそうで怖くて。
0328nobodyさん
2006/10/08(日) 00:48:40ID:???そういう場合は一度にどれだけ連続的なアクセスをしたかが問題になる。
2000項目全てを一気に全部取りに行ったりしたら流石にどうかと思うけど、
数ヶ月かけて順番に2000ページにアクセスしたんじゃ負荷は全く些細なものだろう。
ところでその上司にはライセンスまわりは大丈夫なのかと聞いておいた方がいいw
0329nobodyさん
2006/10/08(日) 00:52:55ID:???0330nobodyさん
2006/10/08(日) 00:58:03ID:???相当テンパってるなあ…。話に出ている入力→確認→完了の流れで、
確認画面のhiddenの値をどう書き換えれば他人の個人情報を漏洩できるのかちょっと考えてみ?
0332nobodyさん
2006/10/08(日) 02:00:32ID:???つ ttp://search.cpan.org/~dionalm/File-Recurse/
# CPANでFileとRecurse(再帰)で検索。
# ファイル生成は手動かな。これは再帰的にディレクトリを掘るだけみたい。
0333nobodyさん
2006/10/08(日) 02:01:41ID:???それが自分の場合にあてはまるかどうか判断もつかないんだろうな。Perl以前の
問題な気がする
0334nobodyさん
2006/10/08(日) 03:11:24ID:???hidden の安全性はページにtextなりで公開されてるのと同じだと思え、というだけでしょ。
そのときだけ本人に公開して困るもんじゃなけりゃいいと思うが。
つまり CGI で (クッキーから読んだ) パスワードなんかを method=get 内での hidden に入れるととても危うい。
0335nobodyさん
2006/10/08(日) 03:24:01ID:???0336nobodyさん
2006/10/08(日) 04:10:27ID:???CSRF対策はちゃんとやっとけよ
0337nobodyさん
2006/10/08(日) 05:05:23ID:o6JUYv0D16進数になっているデータをPerl を使って日本語にデコードし直すのはどうしたらいいでしょうか?
データの内容は「今日は晴れてるよ。」と入っていて、
16進数で
0xc3a4c2bbc5a0c3a6e28094c2a5c3a3c281c2afc3a6e284a2c2b4c3a3e2809ac592c3a3c281c2a6c3a3e2809ae280b9c3a3e2809acb86c3a3e282ace2809a
となっています。
データの内容が日本語でなければ、以下のようにやれば、見れる事がわかったのですが、
(例えば、16進数 0x54455354 で TESTと表示される)
#!/usr/bin/perl
$char = pack("H*",$ARGV[0]);
print "$char\n";
> ./test.pl 0x54455354
TEST
案の定日本語だと表示が上手くできません。jcode.pl でも使って、
#!/usr/bin/perl
require "jcode.pl";
$char = pack("H*",$ARGV[0]);
jcode::convert(\$char,'euc');
print "$char\n";
と記述すればいいのかと思ったのですが、できませんでした。
誰かご教授頂けないでしょうか?よろしくお願い致します。
0338nobodyさん
2006/10/08(日) 05:27:53ID:???ちょっとまて、「今日は晴れてるよ。」がそんなに長くなるわけない。
その16進数をデコードしても、どの文字コードにも該当しないけど、本当にあってる?
0339nobodyさん
2006/10/08(日) 05:30:11ID:???0340300
2006/10/08(日) 09:50:04ID:???大丈夫ですね。もっと勉強しつつ作ることにします。ありがとうございました。
0341nobodyさん
2006/10/08(日) 10:00:52ID:???0342nobodyさん
2006/10/08(日) 10:19:55ID:???byte[] b = new byte[32];
b[0] = 45;
b[1] = 123;
b[2] = 0xAB;
for (int i=0; i<b.length; i++) System.out.println(b[i]);
文字と数字の自動変換や、byte配列の表し方などで詰まっています。
0343momo
2006/10/08(日) 12:34:11ID:psSjFhxx$REC1には予め"a,b,c"があるとする。(カンマのみで区切られたデータ)
$REC2には予め"あ,い,う"があるとする。(カンマのみで区切られたデータ)
これを
下記の様に出力したいのですが、どの様に記述すればできますか?
<table>
<tr>
<td>a</td><td>あ</td>
<td>b</td><td>い</td>
<td>c</td><td>う</td>
</tr>
</table>
どうぞ教えてください。
0344nobodyさん
2006/10/08(日) 14:28:24ID:???それが意図する動作を説明しない限り
PerlもJavaもできてなおかつ親切な人の出現を永久に待ち続ける事になるぞ。
とCを勉強中の俺が言ってみた。
0345nobodyさん
2006/10/08(日) 14:41:20ID:???$REC1 = "a,b,c";
$REC2 = "あ,い,う";
@abc = split(/,/, $REC1);
@aiu = split(/,/, $REC2);
print "<table>\n";
print "<tr>\n";
for ($n = 0; $n < @abc; $n ++) {
print "<td>" . $abc[$n] . "</td><td>" . $aiu[$n] . "</td>\n";
}
print "</tr>\n";
print "</table>\n";
# 出力:
# <table>
# <tr>
# <td>a</td><td>あ</td>
# <td>b</td><td>い</td>
# <td>c</td><td>う</td>
# </tr>
# </table>
0346nobodyさん
2006/10/08(日) 14:58:40ID:???たんにバイナリデータを出力してクライアント側のソフトと通信したいだけなんです。
相手がC++のintで受けるので、それにあうバイナリを吐きたいです。
Cではこんな感じです。
#include <stdio.h>
int main(void) {
int i;
byte b[32] = { 45, 123, 0xAB };
for ( i = 0; i < sizeof(b) / sizeof(b[0]); i++ )
printf("%d", b[i]);
return 0;
}
0347nobodyさん
2006/10/08(日) 16:40:09ID:???hiddenが悪いんじゃなくて設計がわるすぎw
0348nobodyさん
2006/10/08(日) 18:30:13ID:???my @b = ();
$b[0] = 45;
b[1] = 123;
b[2] = 0xAB;
for( my i=0; i<=$#b; i++){ print $b[i]; }
foreach my $i(0..$#b){ print $b[i]; }
こんな感じ?
0349nobodyさん
2006/10/08(日) 18:31:11ID:???packとかunpackつかえばいいんじゃね?
0350ヽ(´ー`)ノ ◆.ogCuANUcE
2006/10/08(日) 18:48:38ID:???public class Test {
public static void main(String[] args) {
byte b = 0x20;
System.out.println(b);
}
}
# => 32
これなら >>348 でいい気が…。
byte b = 0xAB に至っては、精度が落ちている可能性があると言われて
byte にキャストしないとエラー。多分、MSB が立ってるからだと思うが。
0351ヽ(´ー`)ノ ◆.ogCuANUcE
2006/10/08(日) 18:52:14ID:???public class Test {
public static void main(String[] args) {
byte[] b = { 45, 123, (byte)0xAB };
System.out.write(b, 0, 3);
}
}
んで、Perl で書くとこう。
my @b = (45, 123, 0xAB);
print pack('C*', @b);
もうちょっと質問の仕方、考えような。
0352nobodyさん
2006/10/08(日) 18:55:26ID:???なんとかできそうです。ありがとうございました。
0353momo
2006/10/08(日) 21:40:47ID:psSjFhxx本当に感謝です。
どなたか分かりませんがありがとうございます。
大好きです!
0354nobodyさん
2006/10/08(日) 21:58:21ID:???0355nobodyさん
2006/10/08(日) 23:44:17ID:???[hoge.pl]
package Hoge;
our $moge = 'a';
[test.pl]
require "hoge.pl";
my $t = $Hoge::moge;
Name "Hoge::moge" used only once : possible typo at test.pl
0356nobodyさん
2006/10/09(月) 00:04:48ID:???PERLにてパターンマッチ処理をしたいのですが「 >>レス番 」をキーワードにしてパターンマッチしたとき
うまくひっかかりません
$KEYS=">>".$resno;
if ($data =~ /$KEYS/) {
処理・・・
}
としているのですが、どうすればいいでしょうか?
0357nobodyさん
2006/10/09(月) 01:57:46ID:???$Hoge::moge が 1 回しか使われてないから、ひょっとしたら打ち間違いじゃない?という警告が出ている。
hoge.pl 内で設定して require してるなじゃいか、と思うかもしれないが、test.pl の構文解析時には require は
評価されないので、hoge.pl の中身は perl には分からない。
ということで、$Hoge::moge が 1 度だけ使われているように見える。
use を使うようにするか、BEGIN { require 'hoge.pl'; } すると、構文解析時に評価されるようになるため、警告は出なくなる。
>356
引っかけたい文字列は元のデータ内で >> になってる?
DAT ファイルや HTML なんかだと >> になってると思うけど。
0358nobodyさん
2006/10/09(月) 02:27:59ID:???ずばり、そのとおりでした^^;
>>になってますねw
ちなみに>>356ですると
$resnoが1で
「>>1」のレスをひろってきたいのですが
>>123とかもひろってきます。
どう対処すればよいのでしょうか^^;
0359nobodyさん
2006/10/09(月) 04:12:59ID:???http://ex16.2ch.net/test/read.cgi/news4vip/1160328561/
たまたまこちらに同じ質問とその回答があるので
参考にしてみてはどうでしょうか
0360nobodyさん
2006/10/09(月) 05:48:14ID:???最初からセキュアプログラミングをしていない hidden に価格データ入れているプログラムで、
後付けの「サニタイズ」をするにはどうすればいいのだろうか…。
・hiddenに十分な強度の共通鍵暗号で暗号化した価格データを入れる。
→任意の価格データには詐称はできないけど、他の商品の価格とすり替えが可能に。
・hiddenに 「商品ID」 やら 「セッションID」 やら 「価格データ」 やらを全部まとめて十分な強度の共通鍵暗号で暗号化したデータを入れる。
→これで完璧、ですよね?
0363nobodyさん
2006/10/09(月) 06:39:32ID:???0364nobodyさん
2006/10/09(月) 06:46:10ID:???それだと、アクセシビリティ上の問題が発生するじゃん
例えばセッションの保有期間が1時間だったとしよう。
個人情報の入力中にご飯を食べにいって、帰ってきてから続きいれて決定押して
「セッションの有効期間がすぎました。お手数ですが最初からやり直して下さい。」
なんて言われたら腹がたつだろ?
下手したら、その店には二度といかないかもしれない。
有効期限を延ばしすぎると、サーバ負荷が高まるし、例え2日にしたとしても
決算確認画面まで来てで「やっぱ、購入するのは3日後にしよ。それまでブラウザは開いたままにするか。」という客がいるかもしれない。
P2PやIRC、ネットゲームの露天、タブブラウザの普及も関係してか、PCつけっぱなしの人、ブラウザのタブを長期間開く人も予想以上に増えている。
情報を全て暗号化した上で hidden にいれとけば、
・セッション使用に比べてサーバ負荷が少ない
・強度の暗号を使用すればセキュリティ上の問題も無い
・セッションタイムアウトでユーザがいらつくことがない
というメリットがある
0368nobodyさん
2006/10/09(月) 11:27:54ID:???それじゃマジで何のためにhiddenに値段埋め込んでるのかわからないじゃねえか
商品IDだけで買う商品が特定できないわけじゃあるまいし
0369nobodyさん
2006/10/09(月) 11:37:23ID:???0371nobodyさん
2006/10/09(月) 12:16:12ID:???IDから引っ張る設計にしたら、
太郎くんが買い物かごに 500円のお米をいれました。
そして購入確認画面で内容をじっくり確認していました。
その時にサイト管理者が商品の価格を80円値上げしました。
そんな時に 「購入」 ボタンを押すと、確かに500円で注文したはずなのに、580円太郎くんのクレジットカードから引き落とされました。
こんなことがおこるわけだが?
そして太郎くんは消費生活センターに苦情を申し立て、2chでそのショップを誹謗しまくり(詐欺だの価格詐称だの)、ついでに、
新聞に投書までしました、ってことにもなりかねないぞw
0372nobodyさん
2006/10/09(月) 12:19:45ID:???0373nobodyさん
2006/10/09(月) 12:41:43ID:???わかったよな?
0375nobodyさん
2006/10/09(月) 12:45:25ID:???0376nobodyさん
2006/10/09(月) 12:46:54ID:???0377nobodyさん
2006/10/09(月) 13:07:20ID:???どんな実装されるやら・・・
0378nobodyさん
2006/10/09(月) 13:50:24ID:???突然のセールでも対応可能。
0379nobodyさん
2006/10/09(月) 13:52:28ID:???だいたい >>364 の理論でいくと、1ヶ月とか数ヶ月くらいそのデータ保持してても問題ないってことになるよな。
店で期間限定のチラシの値札もってきてその値段で買わせろってヤツがどこにいるんだ? 大陸か?
0380nobodyさん
2006/10/09(月) 14:26:27ID:???#!/usr/bin/perl
print "Hello" ;
この2行を記述してtest.cgiとしてアップロード・パーミッションは755に
でもScript Error
The script did not produce proper HTTP headers
って出ます。
対処法を教えてくださいまし
0383nobodyさん
2006/10/09(月) 14:39:46ID:???print"<meta http-equiv='Content-Type' content='text/html'; charset='SHIFT-JIS'>";
0384nobodyさん
2006/10/09(月) 14:40:46ID:???ぐぐれ
あるいは適当な配布cgiスクリプトでもダウンロードして、
文字出力の前にどういうことをやってるかでも見てみりゃいい
0385nobodyさん
2006/10/09(月) 14:42:59ID:???http://www.google.com/
0386nobodyさん
2006/10/09(月) 14:47:30ID:???( ´_ゝ`)
>>382
自分で調べようという努力をしない香具師、自力で調べる能力の無い香具師はプログラミングに向かない。
お前さんはどうやらプログラミングに向いてないようなので、さっさとやめましょう。
0387nobodyさん
2006/10/09(月) 14:52:43ID:???これをつけたら直りました。
サンクス
0388nobodyさん
2006/10/09(月) 14:58:07ID:???#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "Hello\n";
$count = 1;
print"$count\n";
$count = 100;
print"$count";
と、
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "Hello<br>\n";
$count = 1;
print"$count\n";
$count = 100;
print"$count";
では、表示させたさい、Helloのあとに改行がつくかつかないかの違いなのですが
解説サイト等ではダブルクォーテーション内で\nをつかば改行とか書いてあるんですけど
実際には改行されず、スペースキーを打ったような状態になってます、
なんででしょうか?
0389nobodyさん
2006/10/09(月) 15:10:18ID:???『html』なら<br>でなきゃ改行にならない。
『html』ではない別の指定でなら、\nで改行になる。
その解説サイトの解説をすみずみまでよく読んだか?
あるいはその解説サイトがいいかげんな可能性もあるが。
0392nobodyさん
2006/10/09(月) 17:40:17ID:???改行コードは半角スペースとして認識されるとか。
0393nobodyさん
2006/10/09(月) 17:57:38ID:???0394nobodyさん
2006/10/09(月) 19:24:19ID:???モジュールを評価して欲しいのですが、
どこのスレがいいでしょうか?
0395nobodyさん
2006/10/09(月) 21:05:59ID:???0396nobodyさん
2006/10/09(月) 21:46:17ID:???0397nobodyさん
2006/10/09(月) 22:11:45ID:???0398nobodyさん
2006/10/09(月) 23:33:30ID:???このスレの最近の流れを遡ってみたよ。
>>388 # HTML の記法
>>380 # HTTP
>>318 # に至っては >>325「Perlかなにかで」
>>300 からの hidden 云々 # Web アプリに特有の安全性の問題
>>253 # Perl による Web アプリケーション実装における安全性の問題
# (そして CGI の文脈でしか考えてくれないため >>270 のようなトンチンカンなことに)
>>251 # サーバ間のリソース参照
これ全部あっちでも取扱わなきゃダメかなあ?
できれば勘弁して欲しいなあ。
0399nobodyさん
2006/10/09(月) 23:44:52ID:???0400nobodyさん
2006/10/10(火) 00:03:04ID:???0401nobodyさん
2006/10/10(火) 00:05:22ID:???うん、もっともだけど、僕両方見てるのでそういうんでもないんだよ。
ただ僕は、あちらでは「Perl の話」をしたいと思っていて、こちらでは Perl/CGI を軸とした Web アプリケーション開発全般の話題を期待しているわけよ。
で、両方を混ぜちゃうと >>398 で挙げたようないわば「Perl 外」の話が「Perl の話」とごっちゃになってしまい、僕にとってあまりうれしくない、ということなんだ。だから決して「Perl 外」の話が嫌で見たくない、ということではないのよ。
■ このスレッドは過去ログ倉庫に格納されています