ミニ白扇の使い方 (6)

Date 2006-09-06 10:19:52 | Category: XOOPS

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 => '青森' ,
			(以下略)
			),
		) ,
	) ;






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=360