Sage++ (Higmmer's Edition)のHTMLフィルタの設定方法について

■ 自作ソフト Posted by ひぐま (Higmmer) on 2006-10-12 at 21:14:55

◆共有テーマ: Firefox [コンピュータ]

Last updated on 2011-09-25

このエントリではSage++ (Higmmer's Edition)に搭載されているHTMLフィルタの設定方法について説明します。

このHTMLフィルタは許可する要素/属性等を指定するホワイトリスト方式を採用しています(CSSフィルタはブラックリスト方式)。フィルタの設定はユーザーが必要に応じてカスタマイズすることができます。但し、当然ながら「HTMLタグを許可する」がオフの場合は全てのHTMLタグが無条件で遮断されます。

Sage++ 1.3.9以前において公式版から引き継いでいた高速HTMLフィルタは脆弱性を含む深刻な欠陥が判明したため、1.3.10より廃止されました。脆弱性の詳細はこちらを参照して下さい。

This entry describes how to customize HTML filters implemented on Sage++ (Higmmer's Edition).

This filter is based on whitelist that specifies allowing elements and attributes (CSS filter is based on blacklist however). In spite of the setting, all HTML tags will be rejected if "Allow HTML tags" is disabled, of course.

Fast HTML Filter in Sage++ 1.3.9 (or less) that had been copied from the original, was removed from 1.3.10 due to detection of serious vulnerabilities.

新しいHTMLフィルタの動作

新しいHTMLフィルタは以下の4つのフィルタから構成されています。

  • HTML要素/属性フィルタ
  • URIスキームフィルタ
  • CSS(スタイルシート)フィルタ
  • 広告ブロックフィルタ

デフォルト状態では、それぞれ以下のフィルタが設定されています。

【詳細フィルタ時にデフォルトで許可される要素・属性及びスキーム】
  • 要素 … div, p, br, a, img, blockquote, ul, ol, li (*1)
  • 属性 … a要素中のhref属性, img要素のsrc/border属性 (*1)
  • URIスキーム … http, https, ftp(*2)

【デフォルトで遮断されるCSSコード】
  • @import, -moz-xxx系(Mozilla拡張), binding, behavior, expression, url, content
(*1) Sage++ 1.3.20.0 / 2.0.0.0以上ではこれ以外にも多くの要素・属性がデフォルトで許可されています。
(*2) 但しフィードタイトルのリンクについてはftpも遮断します。
現状、設定変更は "about:config" 等を使って直接行う必要があります。
詳しくはこちらを参照して下さい。

Behavior of the new HTML Filter

The new HTML filter is composed of these four filters.

  • HTML Elements and Attributes Filter
  • URI Schemes Filter
  • CSS (Stylesheet) Filter
  • Ad-blocking Filter

The following filters are specified by default:

[Allowed elements, attributes and schemes by default]
  • elements - DIV, P, BR, A, IMG, BLOCKQUOTE, UL, OL, LI (*1)
  • attributes - HREF in A element, SRC and BORDER in IMG element (*1)
  • URI schemes - http, https, ftp(*2)

[Rejected CSS fragments by default]
  • @import, -moz-xxx(Mozilla ext), binding, behavior, expression, url, content
(*1) A lot of elements and attributes are newly allowed by default on Sage++ 1.3.20.0 / 2.0.0.0 or above.
(*2) Exception: "ftp" in the feed title link is rejected.
To change settings, you have to configure them directly with such as "about:config" at present. For more details, please refer to here.

HTML要素/属性フィルタの設定

【設定名】
 sage.filter_accept_tags   (文字列)     <Sage++ 1.3.11.5 以下>
 sage.filter.accept_tags   (文字列)     <Sage++ 1.3.20.0 以上 及び Sage-Too>
 extensions.sagepp.filter.accept_tags   (文字列)     <Sage++ 2.3.0 以上>
【書式】
要素名{属性名,属性名,...} 要素名{属性名,...} ...
※要素指定子の区切り文字は " " (半角スペース)、属性名の区切り文字は "," (カンマ)
 属性名の並びにはスペースを入れないで下さい
 大文字小文字は区別されません

(参考)要素指定子の正規表現形式: /^([a-z0-9]+|\*)(\{([a-z0-9\-,]*)\})?/i
【デフォルト】
Sage++ 1.3.11.5 以下 及び Sage-Too 1.0.0 以下:

Sage++ 1.3.20.0 以上 及び Sage-Too 1.0.1 以上:

Sage++ 2.0.0 以上:
  上記に INS と DEL を追加
【メニューから】
設定 → コンテンツエリア → 高度な設定 → HTMLフィルタ → 許可する要素と属性

許可するHTML要素及び属性を記述します。この設定名が存在しない場合はデフォルト規則が適用されます(値を作成した場合はそちらが採用されます)。この値として空文字列を設定すると全ての要素/属性が遮断されます。

要素名の後ろの{ }の中に属性名を列挙することで、その要素に含めることができる属性を限定することができます。属性指定を省略した場合はその要素内の全ての属性が遮断されます。

div p br a{href}  …  div, p, br, a要素、及びa要素のhref属性(リンク)を許可する
img{src,border}  …  画像の表示を許可する

要素名に"*"を指定することで全ての要素に共通の属性を許可することもできます(※)。但し、実際にその属性が有効になるのはその属性を持つ要素自体が同時に許可されている場合のみです。

*{style}  …  全ての要素のスタイル指定を許可する
(※) "*"を単独で記述しても全ての要素を許可するという意味にはなりません(単に無視されます)。

例外規則として、iframe要素だけは許可することができません(許可する必要もないと思いますが)。

いちいちフィルタ設定を入力する手間を省けるよう、いくつか代表的な設定例を置いておきます(クリップボードにコピーして使って下さい)。

最小限の設定 
+画像、引用及びリストを許可 
 (デフォルト規則) 
+スタイル指定を許可 
主要な基本要素をだいたい網羅 

Configuring HTML Elements & Attributes Filter

[Name]
 sage.filter_accept_tags   (String)     <for Sage++ 1.3.11.5 or less>
 sage.filter.accept_tags   (String)     <for Sage++ 1.3.20.0 or above and Sage-Too>
 extensions.sagepp.filter.accept_tags   (String)     <for Sage++ 2.3.0 or above>
[Format]
element{attribute,attribute,...} element{attribute,...} ...
  [Separator] for elements: " " (space) / for attributes: "," (comma)
  Don't insert spaces in the attribute list
  Case ignored

(ref) Regular expression: /^([a-z0-9]+|\*)(\{([a-z0-9\-,]*)\})?/i
[Default]
Sage++ 1.3.11.5 or less / Sage-Too 1.0.0 or less:

Sage++ 1.3.20.0 or above / Sage-Too 1.0.1 or above:

Sage++ 2.0.0 or above:
  INS and DEL are added to the above list.
[Menu]
Settings → Contents Area → Advanced Settings → HTML Filter → Allowed Elements and Attributes

Specifies HTML elements and attributes that you want to allow. If this entry doesn't exist, the default settings are adopted. All elements and attributes are rejected if the value of this entry is empty.

Enumerate attributes in "{ }" after each element to specify attributes that is allowed in the element. If attributes aren't specified, all attributes in the element are rejected.

div p br a{href}  -  Allows DIV, P, BR, A elements, and HREF attribute in A element
img{src,border}  -  Allows images

You can specify "*" as element wildcard to allow common attributes for all elements(*). However, the attributes are allowed actually only when its container elements are also allowed.

*{style}  -  Allows style specifiers for all elements
(*) The single "*" doesn't mean allow all elements. It's simply ignored.

IFRAME element can never be allowed exceptionally.

Here are some typical examples for saving your time. Copy and paste it, if you need.

Minimum setting
+ Allows images, quotations and lists (same as the default) 
+ Allows style specifiers
Allows almost all of the frequent elements

URIスキームフィルタの設定

【設定名】
 sage.filter_accept_schemes   (文字列)     <Sage++ 1.3.11.5 以下>
 sage.filter.accept_schemes   (文字列)     <Sage++ 1.3.20.0 以上 及び Sage-Too>
 extensions.sagepp.filter.accept_schemes   (文字列)     <Sage++ 2.3.0 以上>
【書式】
スキーム名 スキーム名 ...
※区切り文字は " " (半角スペース)、大文字小文字は区別されません
【デフォルト】
http https ftp
【メニューから】
設定 → コンテンツエリア → 高度な設定 → HTMLフィルタ → 許可するURIスキーム

HTML要素/属性フィルタで許可した属性のうち、URL記述用の属性(href, src等(※))において使用を許可するスキームを指定します。この設定名が存在しない場合はデフォルト規則が適用されます(値を作成した場合はそちらが採用されます)。この値に空文字列を設定すると全てのスキームが遮断されます。

(※) 具体的には次の各属性について適用されます。
action, archive, background, cite, classid, codebase, data, dynsrc, href, longdesc, lowsrc, src

例えば次のように記述します。

http https ftp  …  http, https, ftpの各スキームを許可する(デフォルト規則)
http https mailto  …  ftpはやめてmailtoを許可する
javascript  …  こんな設定はしないように!(笑)

URIスキームフィルタでは記述されているURIが規約外の文字を含んでいないかどうかも同時にチェックします。不適切な文字を含んでいた場合は無条件で遮断されます(参考:クロスサイトスクリプティング)。

尚、URIスキームフィルタの設定は各エントリの本文(コンテンツ)中に現れるHTMLにだけ効果を及ぼします。それ以外のリンクについて許可されるスキームは以下の通りです。

フィード全体(feed/channel要素)のタイトルのリンク … http https
各エントリ(entry/item要素)のタイトルのリンク … http https ftp
enclosureリンク(ポッドキャストファイル等) … http https ftp

Configuring URI Schemes Filter

[Name]
 sage.filter_accept_schemes   (String)     <for Sage++ 1.3.11.5 or less>
 sage.filter.accept_schemes   (String)     <for Sage++ 1.3.20.0 or above and Sage-Too>
 extensions.sagepp.filter.accept_schemes   (String)     <for Sage++ 2.3.0 or above>
[Format]
scheme scheme ...
  [Separator] " " (space) / Case ignored
[Default]
http https ftp
[Menu]
Settings → Contents Area → Advanced Settings → HTML Filter → Allowed URI Schemes

Specifies URI schemes that you allow using in URL attributes (such as HREF, SRC, etc(*)) allowed by HTML Elements and Attributes Filter. If this entry doesn't exist, the default settings are adopted. All schemes are rejected if the value of this entry is empty.

(*) To be applied to these attributes concretely:
ACTION, ARCHIVE, BACKGROUND, CITE, CLASSID, CODEBASE, DATA, DYNSRC, HREF, LONGDESC, LOWSRC, SRC

For example:

http https ftp  -  Allows http, https and ftp scheme (same as the default)
http https mailto  -  Allows mailto instead of ftp
javascript  -  Don't set like this :-)

URI Schemes Filter also checks whether the given URI doesn't contain invalid characters. If it's detected, rejected absolutely. (See RFC 2396)

In addition, URI Schemes Filter only affects HTML fragments of each entry body. For others, the following schemes are allowed.

for feed title links (in feed/channel element) - http https
for entry title links (in entry/item element) - http https ftp
for enclosure links (Podcasting etc) - http https ftp

CSS(スタイルシート)フィルタの設定

【設定名】
 sage.filter_css_reject_regexp   (文字列)     <Sage++ 1.3.11.5 以下>
 sage.filter.reject_css_regexp   (文字列)     <Sage++ 1.3.20.0 以上 及び Sage-Too>
 extensions.sagepp.filter.reject_css_regexp   (文字列)     <Sage++ 2.3.0 以上>
【書式】
正規表現|正規表現| ...
※前後のデリミタ("/")は不要、正規表現には自動的に"gi"オプションが付加されます
 (大文字小文字の区別なし)
【デフォルト】
@import|-moz-[a-z0-9_\-]*|binding|behavior|expression|url|content
【メニューから】
設定 → コンテンツエリア → 高度な設定 → CSSフィルタ → 遮断するCSS断片

CSS(スタイルシート)において、遮断するコードを正規表現で指定します。CSSフィルタはHTML要素/属性フィルタでstyle要素又は属性が許可されている場合にのみ機能します。但し、通常使用においてスタイル指定を有効にしたい場合はstyle属性のみを許可し、style要素については決して許可しないことを推奨します(※)。

(※) CSSフィルタの処理では厳密な構文解析を行っておらず(単なるパターンマッチ)、またstyle要素の場合はページ全体に影響を及ぼす記述が可能なことから思わぬ副作用が起こる可能性を排除できないからです。

ユーザーが記述したフィルタはデフォルト規則に追加される形となります。デフォルト規則を取り消すことはできません。

javascript|vbscript|cookie|eval|behaviour|include-source|@i|boundary
 → はてなダイアリーXSS対策に載っているやつを追加してみるテスト

color|background|font … うざい色/フォント指定を遮断
display[^:]*:[^;]*none … 見えないのはイヤだ
^(.|\n)*$ … 全部遮断(※)
(※) style要素を禁止した場合にテキスト化されたCSSコードがずらずらと表示されるのが鬱陶しい場合は、style要素を許可した上でCSSフィルタにこれを記述することで回避できます。但し、その場合はstyle属性も同時に無効化されます。

尚、CSSコードに文字参照("\52\45\44"→"RED"等)が含まれていた場合は前もって展開された上で上記のフィルタが適用されます。また、タブと改行以外の制御文字は削除されます(それが文字参照であっても)。更に以下の記号類のエスケープ用途以外の"\"は全て"\5c "に置換されます。

'   "   {   }   ;   :   (   )   #   *

正規表現の文法上誤った記述を行うとフィルタリングエラーが発生しますのでご注意下さい(その場合でもフィルタ動作をすり抜けることはありません)。

文字参照を遮断したい場合(style属性に対しては機能しません):

(誤) \[0-9a-f]{1,6}[ \n\r\t\f]?
(正) \\[0-9a-f]{1,6}[ \n\r\t\f]?

Configuring CSS (Stylesheet) Filter

[Name]
 sage.filter_css_reject_regexp   (String)     <for Sage++ 1.3.11.5 or less>
 sage.filter.reject_css_regexp   (String)     <for Sage++ 1.3.20.0 or above and Sage-Too>
 extensions.sagepp.filter.reject_css_regexp   (String)     <for Sage++ 2.3.0 or above>
[Format]
RegExp|RegExp| ...
  Delimiters of regular expression ("/") are unnecessary
  "gi" options are added automatically
  (Case ignored)
[Default]
@import|-moz-[a-z0-9_\-]*|binding|behavior|expression|url|content
[Menu]
Settings → Contents Area → Advanced Settings → CSS Filter → Rejected CSS Fragments

Specifies CSS (Stylesheet) fragments you want to reject by regular expression. This filter is enabled only when STYLE element or attribute is allowed by HTML Elements and Attributes Filter. However, it's recommended that you should allow STYLE attribute only and never allow STYLE element for your normal use (*).

(*) That's because the possibility of unexpected side effect cannot be excluded. CSS Filter doesn't execute strict parsing but does simple pattern matching, and STYLE element can affect whole page.

Your specified filters are added to the default rule. You cannot remove the default.

javascript|vbscript|cookie|eval|behaviour|include-source|@i|boundary
  → More XSS precautions

color|background|font - Rejects obtrusive color/font specifications
display[^:]*:[^;]*none - Shows hidden elements
^(.|\n)*$ - Rejects all(*)
(*) You may see text-converted CSS fragments when STYLE element is rejected. If you feel annoyed with them, you can hide them by adding this filter and allowing STYLE element. As a result, STYLE element and attribute are rejected together.

In addition, if given CSS fragments contain character entities (such as "\52\45\44" for "RED"), they're filtered after decoding. Control characters except tab and linefeed are removed. And, backslashes except escapes for the following characters are replaced with "\5c ".

'   "   {   }   ;   :   (   )   #   *

Note that invalid regular expression may cause filtering error. (CSS Filter is never bypassed even in that case.)

To reject character entities (available for elements only):

(Incorrect) \[0-9a-f]{1,6}[ \n\r\t\f]?
(Correct)   \\[0-9a-f]{1,6}[ \n\r\t\f]?

広告ブロックフィルタの設定

広告ブロックフィルタの設定方法についてはこちらのエントリを参照して下さい。

Configuring Ad-blocking Filter

Refer to this entry about how to configure Ad-blocking Filter.

HTMLフィルタの動作を確認するには (デバッグモード)

【設定名】
 sage.filter_debug_mode   (真偽値)     <Sage++ 1.3.11.5 以下>
 sage.filter.debug_mode   (真偽値)     <Sage++ 1.3.20.0 以上 及び Sage-Too>
 extensions.sagepp.filter.debug_mode   (真偽値)     <Sage++ 2.3.0 以上>
【デフォルト】
false
【メニューから】
設定 → コンテンツエリア → 高度な設定 → HTMLフィルタ → デバッグモードを有効にする

この値をtrueに設定するとHTMLフィルタはデバッグモードで動作し、コンテンツと一緒にログが吐き出されるようになります。設定したフィルタが希望通りに動作しているか、また誤動作や不具合を発見・解決するための参考情報として利用して下さい。万一、フィルタ動作の不備や脆弱性と思われる振舞いを発見された方がおられましたらコメント欄かメールフォームにてご報告願います。

How to Test Your Filters (Debugging Mode)

[Name]
 sage.filter_debug_mode   (Bool)     <for Sage++ 1.3.11.5 or less>
 sage.filter.debug_mode   (Bool)     <for Sage++ 1.3.20.0 or above and Sage-Too>
 extensions.sagepp.filter.debug_mode   (Bool)     <for Sage++ 2.3.0 or above>
[Default]
false
[Menu]
Settings → Contents Area → Advanced Settings → HTML Filter → Enable debugging mode

If this entry is set to true, the HTML Filter runs under debugging mode and starts outputting logs into the bottom of contents. This information helps you check whether the filter runs as you expected, or detect errors or defects. If you find some kind of defects or vulnerabilities of the filter, please report to me through the comment or mail form of this blog.

トラックバック

この記事について書く(FC2ブログユーザー)
※言及リンクの無いトラックバックは無効です

PageTop▲

コメント

PageTop▲

コメントの投稿

 
 
 
 
 
 (後で編集・削除したいなら必須)
 
  

PageTop▲