ここから本文です

Perlでのディレクトリトラバーサル攻撃対策

rimpei125さん

2011/7/600:17:25

Perlでのディレクトリトラバーサル攻撃対策

ディレクトリトラバーサル対策のため変数$filenameに/や\が含まれていれば処理を中断するようなプログラムを組むにはどうすればいいでしょうか?
if($filename !~ /[^ 0-9A-Za-z]/){
処理
}
print "エラー";
とするとInternal Server Errorになってしまいます
正規表現だけでなくうまく対策する方法があれば教えてください

補足if($filename !~ /[^ \w]/){
$test = Jcode->new($filename)->sjis;
print (qq(Content-type:application/octet-stream; name=\"$filename\"\n));
print (qq(Content-Disposition: attachment; filename=\"$filename\"\n));
open(IN,"$filename");
print <IN>;
close( IN );
}else{
print "エラー";
}
書き直してみましたがエラーです
問題の部分はこのようなソースです
この上にperlのパスやjcode.pmがあります
仕様はWin+Apache2+perl5です

この質問は、活躍中のチエリアン・専門家に回答をリクエストしました。

閲覧数:
528
回答数:
2
お礼:
250枚

違反報告

ベストアンサーに選ばれた回答

d4qd4qさん

編集あり2011/7/618:45:09

if($filename !~ /[^ \w]/){

}
else {
print "エラー";
}

# \wは0-9A-Za-zの文字クラス

ではないでしょうか。
また、print "エラー";
の前に、HTTPヘッダ(content-type:text/html; ...)
は出力していますか?

# 補足について
私の環境ではエラーが出ませんでした。
use CGI::Carp qw(fatalsToBrowser);
されてみてはいかがでしょう?(CGIでエラーが出た場合エラーメッセージを表示)
ただ、use CGI::Carpされる前のエラーはさすがに表示できませんが。

質問した人からのコメント

2011/7/6 22:21:19

降参 いま試したところなぜか正しいファイル名を設定した時だけまともに動いて/や¥を入れたときはInternal Server Errorを返すという不思議なプログラムになっていました。
しかし一応目的は果たせました。
検証までしていただきありがとうございました

ベストアンサー以外の回答

1〜1件/1件中

aivarb_nonacさん

2011/7/600:46:54

こんにちは

正規表現だけでというのは、if(・・・)だけでってことでしょうか?
私にはわかりませんのでググッてみました。
1行では終わってないようですが、IPAのサイトに参考になるか分かりませんがコードがありました。


http://www.ipa.go.jp/security/awareness/vendor/programmingv1/b07_07...

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問や知恵ノートは選択されたID/ニックネームのMy知恵袋で確認できます。