Subscribed unsubscribe Subscribe Subscribe

Taintモード時の汚染回避

Taintモードで実行する"-T"オプションをつけていると、以下のプログラムは動かない。

#!/usr/bin/perl -T
use strict;
use warnings;

use Cwd;
use SVN::Client;

my $ctx = new SVN::Client;
my $current_path = Cwd::getcwd;
my $list = $ctx->ls($current_path, 'HEAD', 0);
print "$_\n" for keys(%$list);

SVN::Clientのlsメソッドに与える引数が、Taintモードでは汚染データとして扱われるらしい。
以下のように正規表現を使ってフィルタリングする必要があるようだ。

#!/usr/bin/perl -T
use strict;
use warnings;

use Cwd;
use SVN::Client;

my $ctx = new SVN::Client;
my $current_path = Cwd::getcwd;
if ($current_path =~ /^([\w\.\/-]+)$/) {
    $current_path = $1;
} else {
    die;
}
my $list = $ctx->ls($current_path, 'HEAD', 0);
print "$_\n" for keys(%$list);

ただし正規表現を通すだけで汚染がなくなったことになってしまうので、

$hoge = $& if ($hoge =~ /.*/);

とかやってしまうと、無意味。というか危険。


参考:
http://www.ipa.go.jp/security/awareness/vendor/programming/a04_03.html
404 Blog Not Found:perl - Taint Mode
Perl - Taint mode の効果的な活用方法: 国民宿舎はらぺこ 大浴場


しかしSVN::Clientで出力されるエラー表示が

TypeError in method 'svn_client_ls', argument 2 of type 'char const *'

となるのは何故・・・?
もっとTaintモードに起因するものだと分かりやすいError表示だったらもっと早くそれに気付けたかも知れないのに ><