PEAK XOOPS - ミニ白扇の使い方 (6) in englishin japanese

Archive | RSS |
XOOPS
XOOPS : ミニ白扇の使い方 (6)
Poster : GIJOE on 2006-09-06 10:19:52 (15985 reads)

in englishin japanese
今までは、整数型やブール型のフィールドを追加しましたが、今回はテキスト型を追加してみます。今まで同じで良い、と思うかも知れませんが、さにあらず。整数型と同じ処理だと、Script Insertion脆弱になってしまいます。

手順は同様です。

I. DB にALTER TABLE を発行する

ALTER TABLE (prefix)_users ADD user_map text not null default '';

II. テンプレートを書き換える

minihaku_edituser.html (必要なら minihaku_register.html にも) に挿入


<textarea name="user_map" id="user_map" cols="50" rows="6" /><{$user_map|escape}></textarea>

Smarty modifier の escape を忘れないでください。DBから取得したユーザ情報は基本的にすべて生値でアサインしているためです。

system_userinfo.html

<tr>
  <td class="head">地図</td>
  <td align="center" class="odd"><{$user_uid|minihaku_userinfo:"user_map":"uid"}></td>
</tr>

こっちでは、ミニ白扇プラグインがescapeに相当する処理を行っています。

III. include/config.php にロジックを記述する

III-B 追加フィールド設定

$extra_fields = array(
	'user_map' => array(
		'initval' => '' ,
		) ,
	) ;

初期値が文字列型であることに注意が必要です。(空文字列は、文字列型です)

III-C 初期化・読み出しパート


if( empty( $minihaku_uid4whr ) ) {
	foreach( $extra_fields as $key => $attribs ) {
		$allowed_requests[$key] = $attribs['initval'] ;
	}
} else {
	$db =& Database::getInstance() ;
	list( $allowed_requests['user_map'] ) = $db->fetchRow( $db->query( "SELECT user_map FROM ".$db->prefix("users")." WHERE uid=$minihaku_uid4whr" ) ) ;

	// for the plugin of modifier.minihaku_userinfo.php
	$myts =& MyTextSanitizer::getInstance() ;
	$fields4html['user_map'] = $myts->displayTarea( $allowed_requests['user_map'] , 0 , 1 , 1 , 1 , 1 ) ;
}

最後の部分が重要です。原則的にHTMLの特殊文字をエスケープしなければいけません。

このサンプルでは地図ですから、画像が貼れなかったらあまり意味がないため、BBCodeのデコードは行います。しかし、displayTarea()の第2引数(HTML許可)は0とします。悪意あるユーザに生のHTMLを書かれたら、ScriptInsertionになってしまいます。

BBCodeのデコードなどが必要ない、ごくごく標準的な文字列型であれば、普通に、htmlspecialchars(変数,ENT_QUOTES)した文字列を、$fields4htmlに渡します。

ちなみに、SQL用のエスケープ処理はregisterhook.phpおよびedituserhook.phpにて行っているため、リクエストメンテナンスで特に何らかの処理を行う必要はありません。状況に応じて、禁止ワード処理や文字列丸め処理をいれても良いでしょう。

以前にも書きましたが、フィールドを追加する際には、可能な限り整数型・ブール型に置き換える努力をするべきです。例えば、「都道府県」というフィールドを追加する場合、白扇では文字列として都道府県名がDBに入ってしまいますが、そうではなく、int型で以下の様に定義した方が、安全性だけでなく、メンテナンス性にも優れるでしょう。

$extra_fields = array(
	'user_prefecture' => array(
		'initval' => 0 ,
		'options' => array(
			0 => '' ,
			1 => '北海道' ,
			2 => '青森' ,
			(以下略)
			),
		) ,
	) ;



Related articles
Printer friendly page Send this story to a friend

Comments list

daigo  Posted on 2007/1/4 20:17
いつもお世話になっています。

「ミニ白扇の使い方」はとても参考になりました。担当している社内サイトのアカウント項目を増やす事が面白くて、友人のサイトでも「ミニ白扇の使い方」を参考に項目を増やしてみました。とても理解し易いので簡単でした。
suinさんの白扇のコードを参考にユーザ名の重複チェックも付け加えてほぼ完璧の出来になっています。ありがとうございました。
GIJOE  Posted on 2006/9/30 5:40
いつでも時間は不足気味ですが

Quote:
システム管理用と思われるphpファイルのソースを見ていてもしやとは思っていたのですが、やはり本当に必要だというならコアHackするしかない、ということは理解いたしました。
ところで、GIJOEさんのコメントによるとXoopsCubeではシステム管理画面がテンプレート化されてきているような印象も受けるのですが、この局面でX2をコアHackするのとXCの開発が落ち着くのを待つのではどちらが賢明なのでしょう?

というか、管理画面ですよね?
管理者しか操作しないのですから、大抵のことはphpMyAdminの操作で間に合ってしまうと思いますよ。

もちろん、ある程度テーブル構造を理解しておく必要はありますが、それはフィールドをいじるレベルのコアHackをしているのですから、当然に必要な知識です。

ミニ白扇がらみだと、

users
groups
groups_users_link

だけ理解しておけば、とりあえず十分じゃないでしょうか。ユーザを削除する場合などは、他にも影響出る場所はあるでしょうけど。

いずれにせよ、今の時点で、実用サイトにCube2.1を導入するのは、正直勧められません。
これからもまだまだ抜本的な部分で仕様変更しそうな臭いがプンプンするからです
hamade  Posted on 2006/9/25 21:59
お返事ありがとうございます。
やはりいきあたりばったりで色々なことを学ぼうとしているので、体系的な理解ができていないようで申し訳ありません。
システム管理用と思われるphpファイルのソースを見ていてもしやとは思っていたのですが、やはり本当に必要だというならコアHackするしかない、ということは理解いたしました。
ところで、GIJOEさんのコメントによるとXoopsCubeではシステム管理画面がテンプレート化されてきているような印象も受けるのですが、この局面でX2をコアHackするのとXCの開発が落ち着くのを待つのではどちらが賢明なのでしょう?
データのフィールド数とユーザ数はまだまだマニュアル管理でも間に合う分量です。後々バージョンアップのことも考えるとXCへのバージョンアップを済まして今回想定している仕様を追加する作業を進めた方が良さそうな雰囲気でもありますが。お時間があるときで構いませんので、ご助言いただけますと幸いです。
GIJOE  Posted on 2006/9/23 4:05
この誤解をしている人、多いですね。
白扇もミニ白扇も「systemモジュール」には、手を入れません。

X2管理画面は元々テンプレート化さえされていませんから、コアHackするしかないでしょう。
hamade  Posted on 2006/9/21 15:27
はじめまして。
最近Xoopsの世界に踏み込んでしまったものです。
おかげさまでこのコラムのシリーズでDBへのフィールド追加、ユーザー登録画面(minihaku_register.html)、ユーザー情報表示画面(system_userinfo.html)、ユーザー自身が見るユーザー情報編集画面(minihaku_edituser.html)については書き換えることができました。ありがとうございます。
しかし、システム管理のテンプレート一覧を見る限り、システム管理モジュールのユーザー情報の編集画面をどこから書き換えるべきかわかりません。DBにユーザー情報のフィールドを追加する以上、管理者からも見られるようにしたいのですが、どのファイルに手を入れることになるのでしょうか。それとも何かの設定ミスでフックした内容が読み込まれていない、ということなのでしょうか。
Login
Username or e-mail:

Password:

Remember Me

Lost Password?

Register now!