Perl の -T スイッチ
2006-05-27-3
[Programming]
プログラミング Perl 第3版 VOLUME 2 「23章 セキュリティ」より:
「掟」だそうです!!!
とはいえ、今まであまり意識してませんでした。反省。
というわけで説明。perlスクリプトの先頭を以下のようにする。
実験用スクリプト a.pl:
回避するには掃除が必要。例えば5行目を以下のようにするとOK。
つまり "-T" のチェックを通ったとしても安全性は保証されない。
とはいえリマインダーとしてだけでも十分有意義。
詳しくは perlsec の man ページ (man perlsec) を参照のこと。
追記060528: 5行目の掃除方法を修正しました (man perlsec の例に準拠)。
元は下記↓。ご指摘ありがとうございます (see )。
デーモン、サーバ、および他人のために実行されるすべてのプログラム(例えばCGIスクリプト)には、-Tスイッチを指定すべきである。
[...]
すべてのCGIスクリプトに-Tフラグを指定して実行するということは、単に良い考えであるだけではない--それは、荒野のごときインターネットで生き延びるための掟なのである。
「掟」だそうです!!!
とはいえ、今まであまり意識してませんでした。反省。
というわけで説明。perlスクリプトの先頭を以下のようにする。
#!/usr/bin/perl -Tすると、コマンドライン引数やCGIのパラメタなどの外から来た変数をファイル名として開くときに
Insecure dependency in open while running with -T switch at ...と教えてくれる。
実験用スクリプト a.pl:
実行結果(怒られる):1 #!/usr/bin/perl -T 2 use strict; 3 use warnings; 4 my $fn = shift @ARGV; 5 6 open(F, "> $fn") or die; 7 print F "hello\n"; 8 close F
% ./a.pl daredemonai Insecure dependency in open while running with -T switch at ./a.pl line 6.
回避するには掃除が必要。例えば5行目を以下のようにするとOK。
ただし掃除が正しくされてるかどうかまでは感知してくれない。5 if ($fn =~ /^([a-z0-9]+)$/i) {$fn = $1} else {die}
つまり "-T" のチェックを通ったとしても安全性は保証されない。
とはいえリマインダーとしてだけでも十分有意義。
詳しくは perlsec の man ページ (man perlsec) を参照のこと。
追記060528: 5行目の掃除方法を修正しました (man perlsec の例に準拠)。
元は下記↓。ご指摘ありがとうございます (see )。
5 $fn = $1 if ($fn =~ /^([a-z0-9]+)$/i);