誤った抽象化の代償
Date 2006-06-03 04:38:17 | Category: XOOPS
|
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は、同じ名前でありながら、その腐った仕様は何一つ受け継いでいないとのことです)
誤った抽象化は、脆弱性を生み出すだけです。
|
|