マスタリングPerl (3章 安全なプログラミング技法)
勉強メモ。
- Taint Checking(汚染チェック)
フォームからのデータ、コマンドライン引数、環境変数、ロカール情報、幾つかのシステムコールの結果、すべてのファイル入力などを汚染データとして扱い、これらのデータをシェルを起動するコマンド(system, exec etc...)やファイルやディレクトリ、プロセスに変更を加えるようなコマンドの引数として使用した場合にエラーになる。
以下の場合に汚染チェックが有効になる。
-
- -Tスイッチ
- 実ユーザ(グループ)と実効ユーザ(グループ)が異なる場合(自動的な汚染モード)
- -Tスイッチ以外のスイッチ
- -t -> -Tと同じ処理を行うが、問題が発生した場合、警告のみ
- -U -> 汚染モードを効率的に無効にして、安全でない処理をPerlに実効させる(テスト時とか?)
- 汚染されたデータ
汚染チェックにより、汚染マークされたデータは以下のようになる。
-
- 汚染されるのは、スカラーのみ。配列やハッシュは、汚染されているデータを保持している場合でも汚染マークされない。($array[0]などの個別要素は、汚染マークされている)
- 汚染のチェックは、"Scalar::Util"の"tainted"関数でできる。
- 汚染されたデータに基づいて作成された値も汚染されている。(汚染の継承)
- 汚染データの洗浄
汚染データは、正規表現のメモリマッチを使用してデータの適正部分を抽出することで汚染マークを無効にできる。
なので、以下のような全てにマッチするパターンマッチはしてはならない。
$ARGV[0] =~ m/(.*)/i;
- mod_perlでの汚染モード
mod_perlでは、以下のディレクティブの設定で有効にする。
-
- mod_perl 1.x
PerlTaintCheck On
-
- mod_perl 2.x
PerlSwitches -T