誤った抽象化の代償

Date 2006-06-03 04:38:17 | Category: XOOPS

in englishin japanese
MyTextSanitizerクラスに、addSlashes()というメソッドがあります。この名前を見た瞬間、どんなものだと想像しますか?

MyTextSanitizer自体、フィルター処理を司るクラスであることから、基本的には addslashes() 関数を呼び出すラッパーメソッドだ、と考えるのが自然でしょう。

しかしそれは誤りです。magic_quotes_gpc=offなら、addslashes()をかけるけど、magic_quotes_gpc=onなら何も処理をしない、というメソッドなのです。つまり、まともに処理された変数をここにかけて、SQL用のリテラルエスケープを完了した、と思っていると、magic_quotes_gpc=on の時にSQL Injectionになってしまいます。(せめて、addSlashesGPC()というメソッド名であったら、stripSlashesGPC()との対応で、そういう仕様だと気がつくこともできたのでしょうが)

これは極めてまずいデザインだといわざるを得ません。magic_quotes_gpc=on時の処理などというものは、GPCリクエスト処理の最初に済ませておくべきものでしょう。宙ぶらりんな変数のまま取り扱わせておいて、どこかでまとめて処理される、なんてのが、オブジェクト指向であり抽象化である、とでも思っていたのでしょうか?

実はXoopsObjectもこのようなデザインです。だからこそ、XoopsObjectは「使うべきではない」と一貫して主張し続けています。なぜ、XoopsCubeにおいて、こんな基本デザインが腐っているものを無理矢理使い続けるのか、理解に苦しみます。(※訂正 XoopsCubeでのXoopsObjectは、同じ名前でありながら、その腐った仕様は何一つ受け継いでいないとのことです)

誤った抽象化は、脆弱性を生み出すだけです。




You can read more news at PEAK XOOPS.
http://xoops.peak.ne.jp

The URL for this story is:
http://xoops.peak.ne.jp/md/news/index.php?page=article&storyid=121