Perl の Taint mode は話をややこしくする。。。?2007年01月29日 21時11分17秒

微妙に酔っぱらってるんで適当なこと書いちゃいそうですがまぁいいや(この辺のノリがもう既に超テキトーw)

高木のおじちゃんが何か言ってるけど、とりあえずいいや。`...` だって所詮「極端な例」に過ぎないし。

んで、Perl をあんまりよく知らなそうな高木さんだけに (っていきなりとんでもなくテキトーなこと言ってるなヲレ。。。嘘だったらゴメンナチャイw)、この記事に (っていうかあのサンプルに) 噛み付くのは無理も無いのですが、Perl の Taint mode について説明する場合にあの手の簡潔な例題を示さなあかんよーになるのは仕方がないところがあって、もちろん根本的には「せまんちっくなでざいん」を心がけることが重要なのは言うまでもないことなんだけんどもそんなことは大前提としてとりあえず Perl では Taint mode は使っておこうよ、っていう説明に過ぎないわけで、まぁそういう意味では説明不足って言われれば確かにその通りっちゃその通りなんだけど、この場合噛み付き方もちょっと気をつけないと、「やっぱり Perl の Taint mode は話をややこしくするだけでいいことなんてまるでないんだ!!」って付け上がっちゃう一部の悪しき古参 Perl ユーザーが調子こいて吹き上げちゃっても仕方のないところではあるんじゃないかと思う。

んで、じゃあ実際のところ Taint mode ってどうなのよ? って話になるんだけど、個人的には運用の仕方さえ間違えなければ、それなりに有用な機能だと思ってる。

雑誌に乗っけるサンプルコードなんかだとか、あるいは配布するソースだとか、そういう「本番を想定」していることが想像できるようなプログラムであれば、基本的には使用すべきだと思う。といっても、せいぜいそれは使用しても動くプログラムであることを証明する目的、ぐらいでしかなくて、実際そのソースを拾ってきたりコピペったりして使う人が実運用でも絶対に使わなきゃいけないっていう意味じゃあない。よーするに、Taint mode にしても動くプログラムですよ、っていう実績を証明することの必要性、っていう部分が重要になる。

で、実際の、(恐らく) 正しい (と思われる) 運用方法ってのは、一通りシステムを作り終えた段階で最終チェック的なテストの一つとして、あるいはある程度組み終えたところで設計の正当性を確認する目的で、んー、どっちかっていうと後者の意味合いの方が重要になってくるのかな、とにかくそんなタイミングで Taint mode を ON にしてみて、動くことをチェックする。それだけ。で、そこで動かなかった場合に、原因と、それに起因する設計上の欠陥を調査し、設計上の semantics を考慮したうえで、修正を反映する。つまり、Taint なデータが流れている場所を見つけたからといって、その場所だけを局所的に直す (まさに「サニタイズ」してしまうってこと) んではなくて、それを元に (というかヒントの一つ、ぐらいの目安で) 設計自体を見直す、っていう使い方ができれば、いいんでないかなぁとか思うわけです。

だから一部で言われるような、Taint mode を何が何でも使わなきゃ、っていうのが前面に出ちゃって、それが為だけに何の置換も行わない s/./$&/ みたいなことやって茶を濁すような本末転倒が蔓延ってしまうくらいなら、最初っから何が何でも Taint mode を使え、としてしまうんではなくて、設計上間違っている部分がないことを確認するための手段の一つとして利用する、ぐらいの感覚というか距離感? で使うようにするのが、まぁ妥当なんじゃないかと思う。