Perl - Taint mode の効果的な活用方法
2007-02-12


このプログラムをなんとなーく記述すると、大体以下のようなものになるんじゃないかと思います。 とかいって、この時点でいろいろと突っ込まれそうな気もしないでもないですが。。。

#!/usr/bin/perl -T
# p2h.pl - プレーンテキストを HTML に変換する
use strict;
use warnings;

# 改行モードだけ気を使ってみる
use open IN => ':crlf';
binmode STDIN, ':crlf';

print <<ENDLINE;
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head>
    <title>Output from p2h.pl</title>
</head>
<body>

ENDLINE

$/ = '';    # 1 つ以上の連続する空行をレコードの終端として扱う
while (<>){
    chomp;
    s/[<>&"]/'&'.{qw(< lt > gt & amp " quot)}->{$&}.';'/ego;    # HTML の為のエスケープ処理
    print "<p>$_</p>\n\n";
}

# 残りの骨組みを出力
print <<ENDLINE;

</body>
</html>
ENDLINE

__END__

話がややこしくなるので文字セットとかは気にしないことにしましょう。 改行モードだけはなぜか気を使ってますが (Unix 風環境で CR-LF なテキスト処理をすると、:raw ではうまく行かなかったりする為)

それよりもこのプログラムの突っ込みどころは、行頭の sh-bang で -T オプションとかつけちゃってる割に、プログラム的には汚染モードを用いている意味がこれっぽっちも無いところです。 このプログラム、驚くべきことに、汚染チェックは一つも発生しません。 その為、テキスト内容を出力する箇所で行っているエスケープ処理も単なる置換操作であり、 ブラックリスト方式の処理であるにもかかわらず、スクリプトは普通に実行出来ちゃったりします。

murachi@maha ~ $ ./p2h.pl test.txt
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head>
    <title>Output from p2h.pl</title>
</head>
<body>

<p>汚染モードをうまく活用すると、
&lt;安全ではない&gt; Perl プログラムを作ってしまう事故が、
いくらか起こりにくくなります。</p>

<p>汚染モードを活用した Perl プログラミングに実践してみましょう。</p>


</body>
</html>
murachi@maha ~ $

Taint モジュール

ここでもし、汚染チェックを行うバージョンの print が存在したらいいんだがなぁ、とか考えてみることにします。 ていうか、実際問題として、引数の汚染チェックを行ってから print するサブルーチンを、 Taint モジュールを用いて実装することは可能です。例えば以下のように。

use Taint qw/tainted/;

sub spill {
    if (tainted @_){
        my (undef, $file, $line) = caller;
        die "Insecure request at $file line $line.\n";
    }
    print @_;
}

理想的には組み込みの print 関数をオーバーライドしてしまいたいところなのですが、 あいにく print 関数はオーバーライドできない模様。 仕方がないので別の名前のサブルーチンで置き換えることにします。 出力先が STDOUT で固定されているので返って使いやすいかもしれません (負け惜しみ)。



続きを読む
戻る
[設計・開発]
[個人的メモ]

コメント(全0件)
コメントをする


記事を書く
powered by ASAHIネット