古い記事
ランダムジャンプ
新しい記事
プログラミング Perl 第3版 VOLUME 2 「23章 セキュリティ」より:
デーモン、サーバ、および他人のために実行されるすべてのプログラム(例えば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 b_entry.gif )。
5  $fn = $1 if ($fn =~ /^([a-z0-9]+)$/i);