PEAK XOOPS - 大きな傘のSQL Injection版 (2) in englishin japanese

Archive | RSS |
XOOPS
XOOPS : 大きな傘のSQL Injection版 (2)
Poster : GIJOE on 2009-01-15 16:12:57 (15467 reads)

in englishin japanese
あっという間に1週間経ってしまいましたが、「リクエスト層とDB層の両方を比較して、SQL Injectionを防ぐ方法」の続きです。

PHP汎用の話題であれば、何らかのフレームワークにこれを組み込む、という話になるのでしょうが、今どきのフレームワークはORマッパーを使うものが多く、クエリを直接発行することもないでしょうから、例によってXOOPS用モジュールであるProtectorにどう組み込むか、という話になります。

まず、DBレイヤーをフックする必要がありますが、XOOPSの場合、ここが非常に硬直化していて、後からDBインスタンスを乗っ取ることはほぼ不可能です。つまり、いずれのXOOPSコアについても、データベースファクトリクラスを書き換える必要があります。

フック方法もいろいろ考えたのですが、絶対にリクエスト依存にならない、という理由から、定数を利用することにしました。最初に、XOOPS_DB_ALTERNATIVEという定数が宣言されていれば、そのクラスがDBインスタンスとして用意されます。

class/database/databasefactory.php


			require_once $file;
			/* patch from */
			if ( defined('XOOPS_DB_ALTERNATIVE') && class_exists( XOOPS_DB_ALTERNATIVE ) ) {
				$class = XOOPS_DB_ALTERNATIVE ;
			} else /* patch to */if (!defined('XOOPS_DB_PROXY')) {
				$class = 'Xoops'.ucfirst(XOOPS_DB_TYPE).'DatabaseSafe';
			} else {
				$class = 'Xoops'.ucfirst(XOOPS_DB_TYPE).'DatabaseProxy';
			}
			$instance =& new $class();

これはこれで融通の効かない仕組みではあるのですが、DBインスタンスを直に書き換えるメソッドを追加する、なんてのも危険な気がしたので、各コアチームが採用しやすい形を最優先に考えた結果、こうなりました。

Protector-3.30にはそのパッチも含めたので、ぜひとも採用の検討、お願いします。>minahitoさん・marcanさん・phpppさん

次回はオーバーライドする条件および、比較ロジックについて書きます。


Related articles
Printer friendly page Send this story to a friend

Comments list

GIJOE  Posted on 2009/1/16 5:18
hi McDonald.

It's a good reaction!
The ImpressCMS team looks great with motivations to improve your works.
McDonald  Posted on 2009/1/15 20:28
Quote:
hi minahito, marcan, and phppp.

I've made the patch can be accepted for you.
Please consider it.

See here for a first reaction from ImpressCMS: http://community.impresscms.org/modules/newbb/viewtopic.php?post_id=27989#forumpost27989

Login
Username or e-mail:

Password:

Remember Me

Lost Password?

Register now!