LOGIN ID Password Auto Login Register Now! Lost Password?
XOOPS2BasicManual
About XOOPS
JavaScriptをOnでご覧ください。

6.4 テキストサニタイザ

テキストサニタイザの概要

XOOPSにおけるテキストデータ(文字定数などは除く)は、基本的にすべて、ある特定のフィルタ群を通過します。

そのフィルタ群が、 テキストサニタイザ です。

サニタイズ(sanitize)という言葉は、本来「無害化」という意味であり、一般的には、ブラウザ出力用サニタイズ処理である htmlspecialchars()処理や、SQL用サニタイズ(より正確にはエスケープ)処理であるaddslashes()処理を指します。

しかし、このような無害化処理を完全に独立してしまうと、テキスト修飾処理との関係が難しくなるため、修飾処理も同時に処理できるよう、総合テキストフィルタクラスとして設計されたものが、XOOPSの テキストサニタイザ です。

テキストサニタイザ の実体は、クラス MyTextSanitizerであり、class/module.textsanitizer.php にそのすべてが記述されています。 *1

このクラスが持っているフィルタは以下の通りです。

  • ブラウザ出力系フィルタ
    • スマイリー変換
    • 自動リンク変換
    • BB Code変換
    • 自動br変換
    • HTML用サニタイズ
    • 禁止用語処理
  • SQL用フィルタ
    いわゆるSQL用エスケープ関連処理が一通り用意されていますが、magic_quotes_gpc設定との関係が極めて判りづらい上に、本来、もっとDBに近い側で行うべき処理なので、使用しないのがベストであると思われます。

一般に、テキストボックスで入力された文字列データは、「HTML用サニタイズ」だけを通過し、テキストエリアで入力された文字列データは、モ ジュールの仕様やユーザ自身の指定によって、「スマイリー変換」「自動リンク変換」「BB Code変換」「自動br変換」「HTML用サニタイズ」等を通過します。これらの各変換は、個別にON/OFFできるものもあれば、無効化できないもの もあります。

スマイリー変換

顔アイコン設定 に従って、特定の短めの文字列を小さめの画像への<img>タグに変換します。

テキストサニタイザ におけるテキストエリア用フィルタ群の一つです。呼び出し時に、ON/OFFもできますので、テキストを投稿するユーザが個別にON/OFFできる設計のモジュールも多く存在します。

自動リンク変換

http・www・mailto等から始まる文字列を自動的にリンクに変換します。
この自動リンク変換には、4つのパターンがあります。

  • http://〜 や ftp://〜 といったURIのフル記述を、<a>タグに変換します。
    副作用も少なく、たいていは希望通りに動作してくれますが、URIの最後は、スペースや改行などで明示的に終わりにしないと、文章全体がリンク化することもあります。
  • www. から始まる文字列を、<a>タグに変換します。
    副作用はやや大きく、終了条件も緩いため、やはり文章全体がリンク化する恐れがあります。
  • ftp. から始まる文字列を、<a>タグに変換します。www.の自動変換とほぼ同様です。
  • 左側が半角英数字で構成され、右側がいくつかの記号以外に挟まれた@(アットマーク)を、メールアドレスと見なして、<a>タグ(mailto:)に変換します。
    もっとも副作用が大きな自動リンク変換で、しばしば問題になります。

テキストサニタイザ におけるテキストエリア用フィルタ群の一つですが、呼び出し時のON/OFFができません。つまり、テキストエリア用のフィルタをかけると、無条件で通過してしまうフィルタなのですが、その割に副作用が大きく、問題のある設計だと言えるでしょう。

BB Code変換

ブラケット([ ])で挟まれた特定のタグをBB Codeと呼ばれるルールに従って変換します。
BB Codeルールは、phpBBが起源とされ、海外発の掲示板アプリケーションの多くが採用しています。 *2

XOOPS標準では、以下のようなルールが用意されています。

  • [b]ボールド[/b]
  • [i]イタリック[/i]
  • [u]アンダーライン[/u]
  • [d]打ち消し線[/d]
  • [siteurl=XOOPSサイトトップからの相対パス]リンク名[/siteurl]
  • [url=各種URI表現]リンク名[/url]
  • [color=カラー]文章[/color]
  • [size=フォントサイズ]文章[/size]
  • [font=フォントファミリ名]文章[/font]
  • [email]メールアドレス[/email]
  • [quote]引用部分[/quote]
  • [code]コード部分[/code]
  • [img align="(left|center|right)"]画像URI[/img]
  • [img]画像URI[/img]
  • [img align="(left|center|right)" id="(画像番号)"]代替文字列[/img]
  • [img id="(画像番号)"]代替文字列[/img]

(下の2つはイメージマネージャで、データベース格納イメージを貼り付けた場合にのみ利用可能)

テキストサニタイザ におけるテキストエリア用フィルタ群の一つです。呼び出し時に、ON/OFFもできますので、テキストを投稿するユーザが個別にON/OFFできる設計のモジュールも多く存在します。

また、[img]タグを、<img>に変換するか(画像として同一ページ内に表示するか)、単なる<a>にするか(画像へのリンクだけを表示するか)も、呼び出し時にON/OFFできます。

このあたりまで細かくコントロールできるモジュールは少ないのですが、もし選択できるのであれば、外部画像の表示の危険性を考えて、単なる<a>リンクにしておいた方が無難でしょう。

自動br変換

改行文字を<br />に変換します。CR+LF, LF, CR のいずれも、単一の<br />に変換されます。

これも、 テキストサニタイザ におけるテキストエリア用フィルタ群の一つです。

このフィルタは、HTMLソースコードを、そのままHTMLとして利用する場合に問題になる場合が多いのですが、ちゃんと呼び出し時のON/OFFもでき るように設計されていますので、HTML投稿を許可していながら、自動br変換のON/OFF機能を用意していないとすれば、モジュール設計の方にこそ問 題があると言えます。

HTML用サニタイズ

HTMLタグをタグとして解釈させないためにエスケープするフィルタです。具体的には、<>&'"の5種類の文字を、HTMLエン ティティ化します。PHPを知っている人であればご存じの、htmlspecialchars($text,ENT_QUOTES)です。

不正なクライアントサイドスクリプトを実行させない、というのが最大の目的で、 テキストサニタイザ の中では、唯一「サニタイズ」という言葉の意味に意味に即した変換処理です。

このフィルタは、テキストボックス用フィルタ群の一つにもなっています。というより、テキストボックス用フィルタは、まさにこれだけです。

もちろん、テキストエリア用フィルタ群の一つでもあります。呼び出し時に、ON/OFFもできますが、信用できないサイト訪問者の投稿について、HTMLの直接記述を許可すると、不正なクライアントサイドスクリプトを埋め込まれる危険性があります。

「HTML用サニタイズ」をOFFにするオプション(通常、「HTML許可」と表現されます)は、管理者や信用できるグループだけがコントロールできるように、モジュール設計者はデザインするべきです。

禁止用語処理

一般設定→禁止用語設定 に従って、禁止用語を別の字句に変換します。

このフィルタは、テキストエリア用フィルタ群にも、テキストボックス用フィルタ群にも登録されていません。つまり、モジュールが明示的にテキストデータを通過させない限り、禁止用語処理はなされません。

ただし、 XoopsObjectを利用すると自動的に通過してしまう点には注意が必要で、この副作用による悪影響はかなり大きいでしょう。 *3

*1 class/module.* というクラスは、各モジュールがこれを元にオーバーライドして使って欲しい、という意味だと考えているのは私だけでしょうか
*2 その分、方言も数多いようです
*3 いずれにせよ、 XoopsObject は利用するべきではありません


Previous
6.5 イベント通知システムの概念
Top of contents Next
6.3 ブロックの概念
Back to Page Top
MainMenu
Manuals
Search
XOOPS Official & Dev.
XOOPS Communities