Perl コーディング初心者質問コーナー Part35
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
04/05/26 16:48ID:kkhhiYmo【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこう言う事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0596nobodyさん
04/06/28 09:39ID:???なるべくなら $a $b は使わない方がいい。
あとは、perl 添付のドキュメントを読む。描き方に関しては perlstyle あたりを中心に。
0597nobodyさん
04/06/28 14:51ID:cJ2UZAf9データ区切りは<>を使い文字列にカンマが入っても対応できる
ようにしてあります。
一番先頭のデータを重複の無いキー番号としたいのです
そこでレコード追加時に先頭のデータをチェックして
最大値の次の値と先頭にアルファベットを追加してキー番号を
生成したいのですが、どの様にプログラムを組めばよさそうでしょうか?
A000001<>xxxx<>XXXXX
A000003<>xxxx<>XXXXX
A000010<>xxxx<>XXXXX
A000004<>xxxx<>XXXXX
A000008<>xxxx<>XXXXX
0598nobodyさん
04/06/28 15:04ID:???既出レコードIDの最大値に+1=追加レコードのID、てわかってるならそうすればいいじゃん。
途中まででもいいから自分でやってみるべし。
0599nobodyさん
04/06/28 15:23ID:whqvquC3read(STDIN,$in,$ENV{'CONTENT_LENGTH'});
な形で取得しようとしているのですが長い文章の場合に途中までしか取得
できません。
$inを以下のような感じで出力させると、
print $ENV{'CONTENT_LENGTH'};
print length($in);
$ENV{'CONTENT_LENGTH'} が 8205 のときはlength($in)は 8000 と出力され、
$ENV{'CONTENT_LENGTH'} が 9252 のときもlength($in)は 8000 と出力されます。
$ENV{'CONTENT_LENGTH'} が 8000を下回った場合にはlength($in)は同じ数値が出力されます。
どっちにしても8000しかreadが出来ていないようなのですがどうしてなんでしょうか?
環境はIE6 + redhat9 + perl v5.8 です。
0600nobodyさん
04/06/28 15:30ID:vj4wrqzocgiを直接呼ばれたのとpostで来たのとを区別するにはどうしたらいいのでしょうか?
0601nobodyさん
04/06/28 15:33ID:???ループしないとだめじゃない? とくに入力元がpipeやsocketのときは
適当にどこかのバッファ長まで読まれた状態でひとまず戻ってくる
ことはよくある。
0602nobodyさん
04/06/28 15:36ID:???http://perldoc.com/perl5.8.4/pod/func/sort.html
http://flex.ee.uec.ac.jp/texi/perl/perl_54.html
>>599
ご利用の httpd のスレへ行って下さい。
>>600
http://pc5.2ch.net/test/read.cgi/php/1055597189/
>>601
http://perldoc.com/perl5.8.4/pod/func/read.html
http://flex.ee.uec.ac.jp/texi/perl/perl_90.html
0604593
04/06/28 16:26ID:???>リスト中のどれか2つの要素。
>どれがどの順で何回渡されるかは決まってなかったような。
>(sortで使ってるアルゴリズムにもよるだろうし)
ランダムに選ばれた?二つの要素が$aと$bに入れられて、$aの方が大きければ1を等価なら0を
左の方が大きければ-1を返す?$aの方が大きければ$aに入っている要素を左に返す?
$aの中身を左辺に返した場合は元のリストの中からは消えるのですか?
なんかイマイチ流れがわかりません。sort関数については色々見に行きましたが、内部の具体的な
流れが解説されてるサイトが見つかりませんでした;
>>602
perldocは英語ですよね;翻訳かけると関数名まで翻訳されちゃってイマイチ理解できないんですよね;
したのサイトは見たことあります。
0606nobodyさん
04/06/28 18:51ID:???英語が読めないなら駱駝本を買えばいいのに。
http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod
$a と $b に何が入るかは >>602 のページに明示されているし、
sort 関数の使い方ではなくソートアルゴリズムの話ならこの辺
行った方がいいよ。
http://pc5.2ch.net/test/read.cgi/tech/1088022524/
0607526
04/06/29 04:35ID:???use lib 'C:\WINDOWS\デスクトップ\httpd142k\cgi-bin\test';
か
BEGIN{
push @INC,'C:\WINDOWS\デスクトップ\httpd142k\cgi-bin\test';
}
でやるのはわかったのですが、'C:\WINDOWS\デスクトップ\httpd142k\cgi-bin\test'
は絶対パスでないといけないのですか?
サバにアップしたときの事を考えて相対パスでいいならそうしておきたいのですが、
use lib '../c';
use lib '..\c';
などをやってみたところ文法チェックでエラーがでました。ローカル環境ではライブラリを@INCに
追加する時のパスをドライブ名からの絶対指定でないと無理でしょうか?
環境は
win98/ie6/httpd/activeperl5.6/
です。
0608nobodyさん
04/06/29 05:03ID:???漏れはローカルとサーバ両方でパスとかを書き換えず動かしたいので、
my $server = $ENV{'REMOTE_ADDR'} eq '127.0.0.1' ? 'http://127.0.0.1/' : 'http://www.鯖.com/' ;
って事をしている。
0609nobodyさん
04/06/29 05:55ID:???>文法チェックでエラーがでました。
そのエラーメッセージを書こう。
ちなみに相対パスの指定は可能。存在しないパスを指定する事も可能。
e.g. use lib qw(../ /home/you/lib/perl E:/lib/perl);
>>608
use CGI ':cgi';
print server_name();
0610607
04/06/29 06:07ID:???それいいですね。でも相対指定ができるならそのほうが楽ですが。
>>609
エラー文は以下の通りです。続いてファイルの中身を挙げます。
C:\WINDOWS>perl -c C:\WINDOWS\デスクトップ\HTTPD1~1\CGI-BIN\TEST\C\A.CGI
Can't locate Test1.pm in @INC (@INC contains: ../c D:/Perl/lib D:/Perl/site/lib
.) at C:\WINDOWS\デスクトップ\HTTPD1~1\CGI-BIN\TEST\C\A.CGI line 3.
BEGIN failed--compilation aborted at C:\WINDOWS\デスクトップ\HTTPD1~1\CGI-BIN\TEST\C
\A.CGI line 3.
0611607
04/06/29 06:09ID:???#!/usr/local/bin/perl
use lib '../c';
use Test1;
#京
print "Content-type:text/html;charset=euc-jp\n\n";
print "aiueo";
Test1.pmの中身
package Test1;
#京
sub new{
my $self = shift;
my $obj = {a => 1 , b => 2};
bless $obj,$self;
}
1;
a.cgiのlibの一行を
use lib 'C:\WINDOWS\デスクトップ\httpd142k\cgi-bin\test\c';
にするとオーケーがでます。\を/に変えてもオーケーはでます。
相対パスにすることは可能でしょうか?
0612nobodyさん
04/06/29 06:16ID:???演算子って同じような意味のものがあったりするけどどうしてでしょうか?
>や<の比較系は
数値用として<,>,==,<=,>=
文字列用としてgt,lt,eq,ge,le
それで、
and,or
と
||,&&
も用途別なんでしょうか?優先順位は||,&&の方が高いみたいですが。
これも
数値用||,&&
文字列用or,and
なのですか?でも
$a == 1 || $a == 2
ならいいですが、
$a == 1 || $a eq "ふたつ"
の場合は||とorのどちらを使えばいいでしょうか?
0613nobodyさん
04/06/29 06:22ID:???ブラウザで開くとダウンロードのダイアログが開いてしまいます。
ダウンロードではなくそのままブラウザに表示したいので
アドバイスをください。
以下のようにして出力しています。
#!/usr/bin/perl
print qq(Content-type: text/plain\n\n);
print "minapon";
exit;
宜しくお願いします。
0614nobodyさん
04/06/29 06:23ID:???ありましたらお教え下さいますようお願いいたします。
0615607
04/06/29 06:29ID:???$newfoo = substr $foo,hoge1,hoge2,"hoge3";
hoge1=オフセット。取り出しの起点。
hoge2=取り出す長さ。
hoge3=取り出した後にそこに何か入れる場合は。取り出したものを削除するなら""とする。
詳しくは
perl substrでググれば見つかるかと。
0616607
04/06/29 06:32ID:???#!/usr/local/bin/perl
print qq(Content-type:text/plain\n\n);
print "qwertyui";
exit();
をローカル環境でやったけど何も問題はなく表示されたよ?
0617nobodyさん
04/06/29 06:50ID:???激しく板違い。Web鯖の設定。
Options ExecCGI
AddHandler cgi-script .cgi
AddType application/x-httpd-cgi .cgi
各行の意味を確認したうえで好きなようにどうぞ。
0618nobodyさん
04/06/29 06:52ID:???私の環境で>>616のコードでローカルでテストしてみましたが
やはりDLのダイアログが開きます
サーバにアップロードしても同じでした。
ブラウザ側の問題かも知れませんが
ちゃんとtextをブラウザで開ける場合もあるし・・・
0619nobodyさん
04/06/29 09:51ID:???DL後のファイルの中身はなに?
HTTPサーバーは?ブラウザは?
まぁ、どっちにしろサーバー設定かブラウザの問題だね。
0620nobodyさん
04/06/29 10:18ID:???0621nobodyさん
04/06/29 10:50ID:???有難う御座います。
Perlのリファレンス見てたんですが、語句が思い当たらなかったのでたどり着けなかったんです。
ホントに助かりました。
0622nobodyさん
04/06/29 14:33ID:???cryptがサーバ対応してなくてMD5使えないもので、
教えていただけたら幸いです。
0623nobodyさん
04/06/29 16:29ID:???- - - - - Perl コーディング初心者質問コーナー Part35 - - - - -
0624nobodyさん
04/06/29 16:46ID:???MD5.pm
>>612
おそらく優先度の違いだけかと。 好みの問題だけど、括弧を減らしたいときなどに、and, orを使うといいと思う。
らくだ本ではand, orのほうが自然だからこっちのほうがいい、見たいなことがかかれていた気がしないでもない。
0625nobodyさん
04/06/29 17:19ID:???> C:\WINDOWS>perl -c C:\WINDOWS\デスクトップ\HTTPD1~1\CGI-BIN\TEST\C\A.CGI
C:/WINDOWS からの相対パス ../c は C:/c で
C:/c/Test1.pm
D:/Perl/lib/Test1.pm
D:/Perl/site/lib/Test1.pm
./Test1.pm
のいずれも見つからないとエラーメッセージが言っているわけだが。
>>612
http://perldoc.jp/docs/perl/5.6.1/perlop.pod
0626607
04/06/29 21:39ID:???ありがとうございます。早速
use lib 'C:/c';
にかえてやってみました。
C:\WINDOWS>perl -c C:\WINDOWS\デスクトップ\HTTPD1~1\CGI-BIN\TEST\C\A.CGI
Can't locate Test1.pm in @INC (@INC contains: C:/c D:/Perl/lib D:/Perl/site/lib
.) at C:\WINDOWS\デスクトップ\HTTPD1~1\CGI-BIN\TEST\C\A.CGI line 3.
BEGIN failed--compilation aborted at C:\WINDOWS\デスクトップ\HTTPD1~1\CGI-BIN\TEST\C
\A.CGI line 3.
というエラーでした。
C:/c D:/Perl/lib D:/Perl/site/lib
少しエラー内容が変わりましたがやはり駄目なようです。
0628nobodyさん
04/06/29 21:49ID:???>>625の
>C:/WINDOWS からの相対パス ../c は C:/c で
ってのは
C:/WINDOWS からの相対パス ../c は C:/c のことだ
の意味だ(と思われる
0629nobodyさん
04/06/29 22:17ID:???> use lib 'C:/c';
> にかえてやってみました。
>>625がコケてそう。
use lib '../../../cgi-bin/test/c';
C:\WINDOWS>cd デスクトップ\HTTPD1~1\CGI-BIN\TEST\C
C:\略>perl -c a.cgi
0630607
04/06/29 22:46ID:???すみません。
>>629
C:\WINDOWS>cd デスクトップ\HTTPD1~1\CGI-BIN\TEST\C
これをやって移動した場合はlibはなくてもエラーはでないです。
質問としましては、どのフォルダからでも文法チェックができるように自作モジュールを
コンパイルの初めに@INCに追加してやりたいんですが、そのモジュールのある場所を相対指定できませんか?
ということです。
それで一応
use lib '../../../cgi-bin/test/c';
use lib 'C:../../../cgi-bin/test/c';
に変えて試しましたが、やはり下のエラーでした。(1行目の場合のエラー内容です。)
C:\WINDOWS>perl -c C:\WINDOWS\デスクトップ\HTTPD1~1\CGI-BIN\TEST\C\A.CGI
Can't locate Test1.pm in @INC (@INC contains: ../../../cgi-bin/test/c D:/Perl/li
b D:/Perl/site/lib .) at C:\WINDOWS\デスクトップ\HTTPD1~1\CGI-BIN\TEST\C\A.CGI line
4.
BEGIN failed--compilation aborted at C:\WINDOWS\デスクトップ\HTTPD1~1\CGI-BIN\TEST\C
\A.CGI line 4.
>>628
ここまで書いて今気づきました。
>C:/WINDOWS からの相対パス ../c は C:/c で
../cはC:/cと書いてるのと同じことになるってわけですね;すみません勘違いしました。
それでやはり相対指定はムリなのでしょうか?
0631607
04/06/29 22:50ID:???からによる相対していなのですね?合ってます?
そうなるとコマンドプロンプト自体がフォルダ移動すると、パスが変わってくる。だからムリ?
でもなんかまだ勘違いしてるかもしれません。a.cgiに書くパスを相対パスにすると
何に対しての相対になるんでしょうか?a.cgiではないですよね?
0632nobodyさん
04/06/29 23:22ID:???> use lib '../../../cgi-bin/test/c';
スマソ、↑寝ぼけてますた。
吊ってきます。
カレントディレクトリ。
0633607
04/06/29 23:30ID:???カレントディレクトリということはやはり、プロンプト画面の現在作業場所からということになり、
結局libは相対指定が効かないということでよろしいでしょうか?
0634nobodyさん
04/06/29 23:43ID:d2XzHbrj$test = abc123;
と入っている場合、数字の数だけ調べたいのです。
どなたか、ご教授お願いします。
0636607
04/06/29 23:59ID:???ですよね。でもそうなると、libに渡すパスは相対指定が不可能ですよね?
でも>>609さんが相対パスは可能と言っていたのでよくわかりません。
ちなみにサーバにあげた場合もlibのパスを相対で書くと、DOS(UNIX系なので違うぽ)作業ディレクトリ
が基準になりますよね?
その場合はDOSは自動で、a.cgiがある場所まで移動してからコンパイルを行うのでしょうか?
そうだとするとサバ上ではa.cgiがあるフォルダからの相対パスで行けますよね。
でもわざわざ作業ディレクトリを移動してからコンパイルなんてしませんよね。
結局相対パスはあまり使い物にならないんですかね。サバのカレントディレクトリから書けば
サバでは相対にできそうですがやはり絶対指定しておくのが無難ぽいですね。
長くお付き合いいただきありがとうどざいました。失礼します。
0638nobodyさん
04/06/30 00:18ID:???スクリプト中に書かれた相対パスは全てカレントディレクトリからの
相対パスであって、スクリプトが置かれているディレクトリからの
相対パスではない。@INC に相対パスを指定する事は可能だが、
君が常にスクリプトの置かれているディレクトリをカレントディレクトリ
として起動しない限り、期待するディレクトリを指す事にならない。
故に、モジュールやライブラリは通常特定のディレクトリに置き、
絶対パスで指定する事でどこからでも利用可能にする。
どうしてもスクリプトが置かれているディレクトリからの相対パスを
使いたいのなら、スクリプトの最初に以下のような阿呆らしいコード
を追加する事で可能になる。
BEGIN {
__FILE__ =~ m|^(.*[/\\])[^/\\]+\z|;
require 'lib.pm';
lib->import($1 . '../log');
}
0639ウド
04/06/30 18:25ID:???クライアント:WindowsXP Pro
これまで同じスクリプト(簡単なメモCGI)をWindows2k、apache2.0.x、perl5にて動作させておりました。
サーバー変更に伴い、文字コードをshift-jisからeucに変更しました。
Windows2kサーバーにて動作させたところ正常に動作しました。
確認後にLinuxに移しました。
Linuxにて動作させたところ、Winクライアントから書き込んだらログファイルの
文字コードがshift-jisにて保存されてしまい、正常に動作しなくなりました。
考えられる原因はなんでしょうか?
ログファイル、スクリプトファイルともにEUCにて保存、アップロード。
cgi-lib.pl使用、jcode.plは使用していません。
データの受け取りは&ReadParse(*form);として、form{'comment'}として
うけとっています。
フォームはvalue=\"comment\"です。
スクリプトの先頭で文字コードをeuc-jisと設定しています。
0640ウド
04/06/30 18:54ID:???ログファイルに少しでもデータがある場合(追記のような状態)、ログファイルに
セットされた文字コードが適用されるようです。
print OUT,">log.dat";とかにすると、文字コードがshift-jisに再セットされてしまいます。
Linuxからの入力は問題ありません。
0641nobodyさん
04/06/30 21:37ID:???もしくは、CGI側でEUCに変換してもいいと思う。
あと、cgi-lib.plはもういらないでしょ。jcode.pmかencode.pmを使おう。
0643ウド
04/07/01 10:36ID:???フォームも同一スクリプトで生成しているので、ヘッダではeuc-jisで指定しています。
cgi-lib.plはフォームのハッシュを扱うのに楽だったので使用していました。
今、CPANからJcode.pmを取得しインストールしました。
これと組み合わせて使ってみます。
アドバイスありがとうございました。
>>642
動きますが、個人的にEUCが好きなものでして。
製作するスクリプトのコードもEUCにしている為なにかと都合がいいのです。
0644nobodyさん
04/07/01 12:52ID:oq3ug3s3EXCELにあるような最大値を求める関数がみあたらないのですが、どうしたらいいものでしょうか?
0646nobodyさん
04/07/01 13:16ID:???record.txt
--
A000001<>xxxx<>XXXXX
A000003<>xxxx<>XXXXX
A000010<>xxxx<>XXXXX
A000004<>xxxx<>XXXXX
A000008<>xxxx<>XXXXX
--
open IN, 'record.txt' or die "$!\n";
while(<IN>){
chomp;
$record{(split(/<>/,$_))[0]} = $_;
}
print (((sort keys %record))[-1]);
--
出力:A000010
昇順に並べれば一番後ろが最大値
降順に並べれば一番最初が最大値
0647nobodyさん
04/07/01 15:27ID:???List::Utilのmax使え。速いぞ。
ttp://pc5.2ch.net/test/read.cgi/tech/1085564875/71-72
画像の大きさが一定以上大きいときだけ
縮小して表示したいのですがどうやればいいか教えてください。
よろしくお願いします。
0649nobodyさん
04/07/01 21:25ID:???if(でっかい時){ 縮小処理や縮小表示 }
else{ そのまま表示 }
これのどの部分が分からんのだ?
そのことを>>1の書き方で表すとどうなるのだ?
0650nobodyさん
04/07/01 21:25ID:???0651648
04/07/01 21:31ID:???また、画像の縦と横の比率を崩さずに
横幅を100〜150にして表示したいときの
うまい方法はありませんか?
0652nobodyさん
04/07/01 21:33ID:???0654nobodyさん
04/07/01 21:46ID:???0655nobodyさん
04/07/01 21:49ID:???「gif perl 画像サイズ」でググる。jpgの場合も同様。
画像サイズ取得ライブラリって形で公開してる人が多いなぁ。
ゴリゴリ書くサンプルが多いだろうと思ってググってみたんだが....
> 画像の縦と横の比率を崩さずに横幅を100〜150
こりゃ、中学か下手すりゃ小学校で習う計算だな。
0656nobodyさん
04/07/01 22:48ID:???Image::Size
あと、htmlだけどwidthだけしてすればheightは自動で同率で表示する。
> こりゃ、中学か下手すりゃ小学校で習う計算だな。
だな
0657nobodyさん
04/07/01 23:55ID:???書きまちがいだと思うけど、euc-jpね。
あと、ブラウザが自動的に判断してくれるはずだから、
HTTPヘッダとかMETAタグとかは使わずに、何もせずにHTMLの出力をやってみたらどうだろうか。
0658648
04/07/01 23:55ID:???一応完成しました。
ひまつぶしに見てください。
http://www.tcn.ne.jp/~majima/dog/quiz/quiz.cgi
0659nobodyさん
04/07/01 23:56ID:???0660nobodyさん
04/07/02 00:02ID:???[Thu Jul 1 23:57:20 2004] test.pl: Malformed UTF-8 character (overflow at 0x302b374a, byte 0xa5, after start byte 0xbe
) in pattern match (m//) at /home/admin/jcode.pl line 362.
[Thu Jul 1 23:57:20 2004] test.pl: Malformed UTF-8 character (overflow at 0x302b374a, byte 0xa5, after start byte 0xbe
) in pattern match (m//) at /home/admin/jcode.pl line 362.
[Thu Jul 1 23:57:20 2004] test.pl: Malformed UTF-8 character (overflow at 0x302b374a, byte 0xa5, after start byte 0xbe
) in pattern match (m//) at /home/admin/jcode.pl line 362.
[Thu Jul 1 23:57:20 2004] test.pl: Malformed UTF-8 character (overflow at 0x302b374a, byte 0xa5, after start byte 0xbe
) in pattern match (m//) at /home/admin/jcode.pl line 362.
[Thu Jul 1 23:57:20 2004] test.pl: Malformed UTF-8 character (overflow at 0x302b374a, byte 0xa5, after start byte 0xbe
) in pattern match (m//) at /home/admin/jcode.pl line 362.
[Thu Jul 1 23:57:20 2004] test.pl: Malformed UTF-8 character (overflow at 0x302b374a, byte 0xa5, after start byte 0xbe
) in pattern match (m//) at /home/admin/jcode.pl line 362.
何かこのエラーに関して心当たりがおありの方いらっしゃい
ましたらご教授ください。
0661nobodyさん
04/07/02 00:03ID:???いいと思いますけど、1点、
<input type="hidden" name="file_name" value="question1.dat">
の部分はセキュリティ上、良くないです。
このhiddenのタグは使わないような仕様にしましょう。
何で良くないかここで説明してもいいんだけど、これで逮捕された人がいたからな…。
0664648
04/07/02 00:13ID:???うまく回避する方法が思い浮かびません。
今回の場合はたいして問題ないですよね?
0665nobodyさん
04/07/02 00:26ID:???datファイルをopenするとき、ちゃんとパスのチェックしてる?
..が含まれていたり、や/から始まる場合はエラーにしないとだめだよ。
どっちにしろ、下のページは一通り読んでおいたほうがいいよ。
http://www.ipa.go.jp/security/awareness/vendor/programming/a00.html
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の値を変えられるとかなり危険なので修正してみます。
どこかに参考になる方法とか載ってないでしょうか?
■ このスレッドは過去ログ倉庫に格納されています