Perl コーディング初心者質問コーナー Part35
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
04/05/26 16:48ID:kkhhiYmo【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこう言う事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0666nobodyさん
04/07/02 00:49ID:???( ゚д゚)あの板でやってたこのクイズ作ってたのはお前かよっ!
どこが問題ないってよ。
http://www.tcn.ne.jp/~majima/dog/quiz/question4.datにアクセスしたら
答え全部わかっちまってるだろうが。
そもそもなんで問題を書いたファイルをhiddenで渡す必要があるんだ?
0667質問
04/07/02 00:58ID:dBU8jv45ユーザーは www、グループも www、そしてパーミッションが301(-wx --- --t)になってます。
mvでリネームは出来ます。さらに cd で中に入ることは出来ますが、ls しても何も見えません。
そのサーバでは、CGI(Perl)、telnet、ftpが使用できますが、私はスーパーユーザーではありません。
rmdirをする簡単なPerlスクリプトを書いたり、rm -f -d directryとやってもダメでした。
分かる方が居たら、教えてください。・゚・(ノД`)・゚・。
0668nobodyさん
04/07/02 01:07ID:???CGIでchmod(0777)かな?ってやって、その後、telnetで入って削除すればいいよ。
0669nobodyさん
04/07/02 01:11ID:???ご返答有難うございます。
UTFで指定しているところはないのですが、何かの
文字がUTFと認識させてしまっているという解釈で
宜しいのでしょうか。
0671667
04/07/02 01:19ID:dBU8jv45削除できました。
rmやrmdirじゃなくて、一旦 chmod するのは盲点でした。
即答&的確な指示、ありがとうございました。本当に助かりました。・゚・(ノД`)・゚・。
0672nobodyさん
04/07/02 01:21ID:???いや、エラーにするとかじゃなくてデータファイル名はスクリプトに直で書けよ。
他にも設計やコーディングの誤りがありそうな予感・・・
↓ここで添削してもらえ。
自作CGIを評価するスレ
http://pc5.2ch.net/test/read.cgi/php/1049514428/
0673648
04/07/02 01:28ID:???ありがとう。
複数の問題ファイルをランダムに選んでるので
ファイル名を直でかくのは無理だと思っています。
とりあえず添削してもらってきます。
0674nobodyさん
04/07/02 01:37ID:???って書いておいて、
<input type=hidden name=question value=0>
ってやればいい。valueが添え字ね。
0675nobodyさん
04/07/02 11:08ID:???HTMLのインデントを揃えたいと思っているのですが、
print <<"EOF";
<HTML><HEAD></HEAD><BODY>
EOF
こう書くと、<BODY>とEOFの間に改行コードがあるために、続けてHTMLを出力すると、
<HTML><HEAD></HEAD><BODY>
</BODY></HTML>
のようになってしまいます。
print <<"EOF";を使っても、一番最後の改行コードを含めないようにする書き方はあるのでしょうか?
0676nobodyさん
04/07/02 11:46ID:???これじゃダメなん?
""の中で改行できるし、"自身が存在するならqq使うかエスケープすりゃいい。
0677nobodyさん
04/07/02 11:46ID:???そもそもはじめから print "<HTML><HEAD></HEAD><BODY>"; とするか、
適当に変数に入れてお尻の1文字削るのが普通だと思われる。
どっちも嫌なら
print @{[<<"EOF" =~ /(.*).$/s]};
<HEML><HEAD></HEAD><BODY>
EOF
とかってのも可能だがオススメしません。
0678nobodyさん
04/07/02 12:48ID:???(test.txtの中身)
あいうえお
%{$obj->{form}}
(hoge.cgiの中身)
use Hoge2;
read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'};
my &obj = Hoge2->new($buffer);
open(FH,"test.txt")
while( <FH> ){
if( $_ !~ /\$/ ){ print;
}else{
print eval $_; }
}
close(FH);
(Hoge2.pmの中身)
sub new{
my $self = shift;
@a = split/&/,shift;
foreach( @a ){
(my $a , my $b ) = split/=/;
$form{$a} = $b;
}
bless,{form => {%form}},$self;
}
1;
0679黒死犬 ◆EgxBlf8nvc
04/07/02 13:26ID:???他の人が変更不可能な状況ならば問題ナッシング
0680678
04/07/02 13:33ID:???ありがとうございます!txtファイルの管理には気をつけます。
print eval $_;
の部分でもしも%formの中にPERLの命令文が入っていた場合とかに実行されちゃうのか
不安でしたが、↑では変数展開されるだけで終わるみたいですね。
展開された内容を再びevalにかけさえしなければ安全ってことですね。
ありがとうございました。
0683678
04/07/02 14:43ID:???ありがとうございます。
>>682
掲示板ではなく注文システムのCGIなので、実行者に跳ね返るだけのことなのであまり気にしてませんが、
一応
$a =~ s/[><";&\[\]\{\}]//g;
$b =~ s/[><";&\[\]\{\}]//g;
としてから%formに入れてます。
一応わかる範囲でタグとか入れて見ましたが、とりあえず問題ありませんでした。
もし、↑のでは不足していたら教えて頂けると幸いです。
0684nobodyさん
04/07/02 14:57ID:???サイニタイジング自体は開いてか受け取ったデータをどこで使うかによって変わってくる。
HTMLなら<,>,&を置換すれば良い。要は、今から処理を行う部分で入ってこられたら困る文字、
特殊文字を消すか、置換するか。
まあPerlは比較的セキュリティ面はしっかりしてるから、上で言ってたようにevalとか
その他一部の関数の使い方に気を付ければよい。
わかってると思うけど、掲示板系のオウム返しプログラムでXSSを軽視していると、
ウイルスが埋めこまれて、利用者が被害をうける事になるから気をつけてね。
0685nobodyさん
04/07/02 14:58ID:???>サイニタイジング自体は開いてか受け取ったデータをどこで使うかによって変わってくる。
サニタイジング自体は相手から受け取ったデータを
の間違い。ごめん。
0686678
04/07/02 15:16ID:???今XSSについて再度記事をよんでますが、掲示板以外でもスクリプトになり得るタグは削除しなくちゃいけませんね。
うちのサイトでタグをちゃんと消していないと、第三者がうちを使っていたずらしちゃいますもんね。
とりあえず、セキュリティホールのなくせるよう頑張ります。ありがとうございました。
0687nobodyさん
04/07/02 15:28ID:???俺は必要のない記号は全て削除してる。
=~|\/;:+][{}()`'"<>&%#,
っていうか
*-@.
以外は全部削除しちゃいなよ。注文プログラムなら上の四つがあれば問題ないでしょ?
掲示板なら実態参照すればいいし。
0688nobodyさん
04/07/02 15:36ID:???基本的にタグだけでも実態参照にしてるサイトならあまり大きな問題はないと思うけど、
対策を何もしていないとこ見てみたい。
http://www.atmarkit.co.jp/fsecurity/special/31xss/xss01.html
ここなんかXSSについてある程度詳しく書いてるけど、ここが言うには
「XSS対策してないサイトが多すぎる」だってさ。
ほんとにそうなんかな?
0689nobodyさん
04/07/02 16:26ID:???あとはSQLインジェクションはヤバイ。まじでヤバイよ。
まずdeleteできちゃう。もう1レコードなんてもんじゃない。テーブルごと。
何しろ無制限。スゲェ!なんか制限とかないの。
しかも他のテーブルも消せちゃう。ヤバイよ、真っ白だよ。
だって普通は削除できないじゃん。だって削除されたら困るじゃん。
訴えられたら困るっしょ。
だからそのCGIはロールバックできる。話のわかるヤツだ。
けど普通のCGIはヤバイ。そんなの気にしない。消えるだけ。
とにかく貴様ら、SQLインジェクションのヤバさをもっと知るべきだと思います。
そんなヤバい仕事をしてる貴様らとか超偉い。もっとがんばれ、超がんばれ。
0690nobodyさん
04/07/02 16:56ID:???私はCGI側でリファラーを一致してるかチェックしてるんですがこれでもまだセキュリティー的にあぶないんでしょうか?
0693nobodyさん
04/07/02 17:11ID:???hiddenそのものが駄目なわけではないので要は使い方の
問題だと思うのだが。hiddenだろうがなんだろうが、やろうと
思えばclientからは何でも送れるので過度に信用するなっ
てこった。
リファラーもclientの自己申告なんで騙され放題。そんなも
のでまともなチェックにはならない。足切りぐらいにはなる
けどな。
0695nobodyさん
04/07/02 18:02ID:???DBIならいきなり渡されたデータを埋め込んだSQL文作って実行じゃなくて
prepare-bind_param-executeにすればめったなことはないと思うんだが
オレの認識は甘いだろうか?
0696nobodyさん
04/07/02 18:11ID:???やっぱりそうですか。
私が作ってるスクリプトはhiddenの値を変えられるとかなり危険なので修正してみます。
どこかに参考になる方法とか載ってないでしょうか?
0697nobodyさん
04/07/02 18:43ID:???CGI: Common Gateway Interface part 11
http://pc5.2ch.net/test/read.cgi/php/1055597189/
0698nobodyさん
04/07/02 19:32ID:???っていうかさ、クエリは常識として毎回中身をチェックしろよ。
多分今の状態ならお前のサイト思いっきりXSSのえじきだよ。
お前の知らないところで、お前のサイトがウイルス配布に使われてるかもよ。
もちろん配布してるのはお前だからお前が逮捕。とりあえず>>688が晒してるサイト程度の
知識は必要だ。
http://www.ipa.go.jp/security/awareness/vendor/software.html
ついでにここも読んどけ。
0699nobodyさん
04/07/02 19:37ID:???うむ、XSSにしろSQLインジェクションにしろhiddenパラメータにしろ、
Perl に限定されない CGIセキュリティの話は、
そちらで話すことが望ましい。
0701nobodyさん
04/07/02 22:18ID:???サイバーノーガード戦法の時代ですよ。
0702nobodyさん
04/07/03 15:11ID:???DBにパスワードを書ける方法がうまくいきません。
具体的には、perlスクリプトからuse Pgでconnectする際、
ユーザ名とパスワードで認証をかけたいのですが、
createdb -W で指定したパスワードがどうしてもきかない
ようです。
認証をかけるところが間違っているのではないかと思って
いるのですが、どうしてもやり方がわかりません。
ご教授いただけますと幸いです。
0703nobodyさん
04/07/03 17:22ID:dEpm626aうまくいく行と文字化けする行があるのですが,うまく変換する
方法はありますか?
CSVデータはこれです。
http://www.post.japanpost.jp/zipcode/dl/kogaki/lzh/ken_all.lzh
use Jcode;
open IN, "./ken_all.sjis";
while(<IN>){
my $line = $_;
chop $line;
$line = jcode($line)->h2z->euc;
print "$line\n";
}
0704nobodyさん
04/07/03 18:07ID:???お茶呑みながらじっくりと眺めてみる。
http://member.nifty.ne.jp/hippo2000/perltips/Pg.htm
>>703
while(<IN>){
chomp;
printf qq|%s\n|, jcode($_, 'sjis')->h2z->euc;
}
0705nobodyさん
04/07/03 19:05ID:???お返事有難うございます。
connectでパスワードを入れても入れなくても
認証されちゃうので、DB(もしくはテーブル)作成
時の問題と踏んでいるのですが間違っております
でしょうか。
0708nobodyさん
04/07/03 21:54ID:MbMdEpi2何にも情報が無いので、
とりあえず pg_hba.conf の設定でも見直してみろ、
と言ってみる
0709nobodyさん
04/07/03 22:29ID:nSj0iEMYのようにして、桁数を調べたいのですが、どのようにすれば良いのでしょうか?
0710nobodyさん
04/07/03 22:32ID:???0712709
04/07/03 22:45ID:nSj0iEMYでした。すいません・・・
0714nobodyさん
04/07/03 23:36ID:???$i=1;
while(1){ if(@_%10<10) $i++) }
return $i+1;
}
0715nobodyさん
04/07/03 23:38ID:???$i=1;
while(1){
$j=1;
for($j=0; $j<$i; $j++){ $j*=10; }
if(@_%$j<10) $i++) }
return $i+1;
}
0717nobodyさん
04/07/03 23:51ID:???別に動かそうと思って書いたわけじゃないが
0719nobodyさん
04/07/04 00:03ID:???10のn乗で割っていくってようりょうだぞーってレスのつもりだが
で、10で割り続けてたので単純にpow入れようやっておもい
Perlってpowあったかなーとおもい、自分でn乗だすようにしてーー
って適当にやったから括弧の場所とかほっときぱなしになったわけだが
良い訳とかキモイ
0720nobodyさん
04/07/04 00:06ID:???int(log($NO)/log10)+1
0721719
04/07/04 00:06ID:???たしかにそうとられても仕方ない罠。
0723nobodyさん
04/07/04 00:12ID:???0724719
04/07/04 00:16ID:???0725nobodyさん
04/07/04 00:26ID:???length取ったほうが速そうだな。誰かベンチしてみない?
0726nobodyさん
04/07/04 00:49ID:???0727nobodyさん
04/07/04 00:52ID:???0728709
04/07/04 00:54ID:Udr24Tj0lengthで調べてみたら、出来ました。ありがとうございました。
もう一点、お聞きしたいのですが、
特定の文字列と一致した場合だけエラーになるようにしたいのです。
$NO="123456";
$NO2="23";
if ($NO eq /$NO2/g) {
print "エラーです";
}
こんなふうに書いたのですが、上手くいきません。
サイトをいくつか見ながら書いてみたのですが、原因がわかりません。
すいません、どなたか教えてください。
0729nobodyさん
04/07/04 00:54ID:???=~
0730nobodyさん
04/07/04 01:35ID:???0732709
04/07/04 01:47ID:Udr24Tj0HTMLで言う、「とほほのWWW入門」みたいに、
Perl開設の良いサイトなど無いでしょうか?
ここのスレに載っていたページはどうもわかりにくくて・・・
0733nobodyさん
04/07/04 01:49ID:???@no = qw(1 2 3 4 5 6);
print $_ = @no."桁\n";
0734nobodyさん
04/07/04 02:16ID:???http://www.big.or.jp/~mio/ga/pl/plref/pl_ref.htm
0735nobodyさん
04/07/04 02:41ID:???> ここのスレに載っていたページはどうもわかりにくくて・・・
だったらなおのこと、本も用意したほうがいいですよ。
>>733
頑張ってください。>>726-727も眺めつつ。
0736nobodyさん
04/07/04 03:33ID:???じゃあ「CGI&Perl究極のレシピ350 とほほが教える」でも買ってみたら?
http://www.esbooks.co.jp/books/detail?accd=31095149
Perlの解説本というより目的別のサンプル集みたいなのだから
丸々コピーばかりしないで参考にすればいくらか勉強にはなるだろう。
0737nobodyさん
04/07/04 07:41ID:???何気に役に立つよ
0738nobodyさん
04/07/04 10:09ID:???知ってると思うけど
http://tohoho.wakusei.ne.jp/wwwperl.htm
0739nobodyさん
04/07/04 13:38ID:bJ9Q5bUPパスワードの暗号か処理で暗号化を施した場合、
暗号化をログから解除して元パスワードを知ることはやはり不可能でしょうか?
例えば↓
sub encrypt {
local($inpw) = $_[0];
local(@char, $salt, $encrypt);
@char = ('a'..'z', 'A'..'Z', '0'..'9', '.', '/');
srand;
$salt = $char[int(rand(@char))] . $char[int(rand(@char))];
$encrypt = crypt($inpw, $salt) || crypt ($inpw, '$1$' . $salt);
return $encrypt;
}
のようなものからパスワードを探ることは・・・?
0740nobodyさん
04/07/04 14:18ID:???0741nobodyさん
04/07/04 14:58ID:???0742nobodyさん
04/07/04 18:07ID:???0743nobodyさん
04/07/04 18:39ID:???$testに環境変数の一部をUserAgent,IPみたいにコンマ区切りで入れたいだけなんですが…
助けてください…
0744nobodyさん
04/07/04 18:43ID:???助けてください…
0745nobodyさん
04/07/04 18:44ID:???07467M. ◆dq7M./4Uw.
04/07/04 18:58ID:???それが出来ないから暗号として成り立つわけで。。。
0747nobodyさん
04/07/04 20:30ID:???今は
$file1 = 'one.jpg';
$file2 = 'two.jpg';
$temp = 'temp.jpg';
rename $file1,$temp;
rename $file2,$file1;
rename $temp,$file2;
ってやってるけど、いい方法ある?
教えてエロい人!
0748nobodyさん
04/07/04 21:22ID:???renameの戻り値は見といたほうがいいと思うよ。
あとはtemp.jpgが固定なのとrenameだと上書きされる
のがちと気になるかな。
私がやるなら多分こんな感じにすると思う。最初のrenameを
linkにしたのは一時ファイル名がすでに使われてるときに上書き
しないため。途中でエラーになった時の処理をどこまで凝るかは
その時によるけどor dieは一番手抜きのパターンね。
$file1 = 'one.jpg';
$file2 = 'two.jpg';
$temp = "temp.jpg.$$";
link $file1,$temp or die;
rename $file2,$file1 or die;
rename $temp,$file2 or die;
0750nobodyさん
04/07/04 22:07ID:Sq5R/TGN全文検索でヒットした奴を
行の真ん中に表示されるようにしたいんですがどうすれば良いんですか?
つまりglobalを検索したとすると、
global SchoolNet Director
we have increased the US publics global awareness
CanWest global Communications
help address global warming issues
California Wood Use Endangers global
↑こういう風に結果を出したいんです。
行全体を出力して、まんなかに検索した語を表示させたいんですが
そもそもどういう方針でやればいいのかさえわかりません。
どうすれば良いんですか?
0752nobodyさん
04/07/04 22:46ID:???もしそうだとしたら、単にHTMLの話だから、
プログラミングでも、Webプログラミングでもなく、Web製作板に行くべきだな。
0755nobodyさん
04/07/05 00:30ID:AbFm7153windowsで動かしているとき、
perlを動かすときにdos窓のウィンドウタイトルはc:\perl\bin\perl.exeや
コマンドプロントから起動させた場合はc:\winnt\system32\cmd.exeのようになって
いると思うのですがそれを任意の文字に設定したいのです。
色々検索してショートカットから起動すれば変えられるのはわかったのですが
当方、rocket mouseというtoolからウィンドウタイトルを任意の文字にした
ものを起動させるのが目的でして、このtoolの場合、plファイルのショートカット
を指定してもそのショートカットから起動させるのではなく、リンク先を参照して
起動するため、ウィンドウタイトルを変更して起動させることができません。
ここを調べろ、ここは確認したのかなどのご指摘ありましたらよろしくお願いします。
0758755
04/07/05 03:14ID:???>>756さんの言うとおりもう一度1を読み返してみます。
>>757
私はてっきりperlスレで質問する内容だと思ったのですが
ご指摘いただいたので違う方向からも再度考えさせてもらいます。
ありがとうございました。
0759nobodyさん
04/07/05 04:03ID:???fork関数を使えば良いですか?
0760nobodyさん
04/07/05 06:29ID:???自分はこんな感じです
/&/&/
/\"/"/
/\'/?/
/</</
/>/>/
/\s/ /
/\r\n/<br>/
/\r/<br>/
/\n/<br>/
他に
こんな文字も危険、この文字はこれに置換がいい的なアドバイスもOK
0761nobodyさん
04/07/05 06:30ID:???/&/&amp;/
/\"/&quot;/
/\'/&#39/
/</&lt;/
/>/&gt;/
/\s/&nbsp;/
/\r\n/<br>/
/\r/<br>/
/\n/<br>/
0762nobodyさん
04/07/05 06:48ID:???0763nobodyさん
04/07/05 10:32ID:???1. コーディング以前の箇所で躓いている
2. 自分の抱える問題がコーディングの問題なのかどうかを切り分けできない
3. そもそもコーディングという言葉の意味を知らない
のいずれかだから。
たぶんこのスレも「Perlを使ったCGIに関する質問ならなんでもOK」だと思われてる
0764nobodyさん
04/07/05 10:59ID:???スレタイ嫁
だけじゃ通じなくなってきたワケだな。
0765nobodyさん
04/07/05 15:04ID:???■ このスレッドは過去ログ倉庫に格納されています