HTML記述の認可はどの程度まで許すか

テーマ ・ プライベート♪ カテゴリ ・ 脆弱性メモ #735
ブログを書く際に、様々なHTMLを利用することにより表現の幅が広がります。

さて、ここでどのようなHTMLを認可すると良いか、簡単に検討してみましょう。
HTMLには、大きく分けて3種類あります。
<ol>
<li>インライン要素</li>
<li>ブロック要素</li>
<li>その他の要素</li>
</ol>1番目のインライン要素とは、主に文字列の意味を定義付けする際に仕様する要素です。この要素を駆使することによって、単なる文字列が意味のある文章へと変化します。主にHTMLで良く使われるのはインライン要素となります。
ブロック要素は、その名の通りで主に段落や文章全体のセクションを分ける為に使用します。デザインのためにも使われますが、デザインのために要素を使うのは意図されていない使われ方です。
その他は、強制改行要素などの空要素、インライン要素だったりブロック要素になったりする変化要素なども有ります。
詳しくは用語の説明を参照。

ここで今回意識するのは、脆弱性を産まない要素を探す事です。
例えば、インライン要素でも意味付けだけの要素であるem要素やq要素cite要素、code要素、samp要素などは許可しても差し支えは無いでしょう。
ブロック要素でも、p要素やbr要素などあります。基本的な部分は許可してもまあ大丈夫でしょうが、これらは記述表現で代用が出来ます。
例えば段落は、投稿内容記入欄で1行の前後に改行が有ればそれを1つの段落と認識してp要素で囲むのが通常だと思われますし、強制改行であるbr要素も、イコールただの改行と捉えても問題はありません。
むしろ、br要素などは許可を与えるとbrを1行に30個書けば30行改行されるという書きやすさという脆弱性(嫌がらせとも言うか)
があります。出来れば只の改行をbrと見なして解釈し、連続改行の数も制限した方が良いかと思われます。

さて、問題が無い要素を出すのは難しいですが、もうハッキリとダメと言える要素を出すのは簡単です。
まずは要素外に記述する要素、html要素や要素、要素(つまり2個以上書く)、link要素要素などは要素の中に記述することは論外なので、エラー判定することが出来ます。html要素や要素が2個以上あるとブラウザによってはレンダリングがずれる場合も有ります。
また、要素に記述出来るが是非エラー判定して頂きたいものとしては、
<ul>
<li>java要素</li>
<li>要素、param要素、要素</li>
<li>フレーム関連(要素など)全部</li>
<li>フォーム関連(form要素や要素など)全部(と言ってもlegend要素やlabel要素は大丈夫です)</li>
</ul>あたりでしょうか。特にjava要素は勝手にjavaを動かされる危険性、要素などは勝手にFlashやexeファイルまでもを読み込まれる危険性、では勝手にJavaアプレットなどが、フレームでは要素をつかって他の外部ページを読み込ませる事ができる危険性、フォーム関連では個人情報を引き出される可能性(を使えばブラウザが記入欄に記載済みで、あとは投稿ボタンを間違って押して貰えば個人情報が入手可能に!)があります。

もっと厳密な判定判断が出来れば、Flashを読み込んだりすることで幅を広げることも可能ですが、直接HTMLでそれをやらせるのは現実的ではありません。
出来れば、Flash等を記事へ貼る際には独自記法を採用し、HTMLで必要以上な事をさせない、許さない事が基本です。

また、要素だけ語っても意味がありません。その要素自体がまったくの無害であっても、属性値が悪意を持つ場合があります。
その中でも、style属性は諸刃の刃です。参考までに以下にstyle属性でフォントサイズを50pxに、文字色を赤にした文字列を用意しました。


<span style="font-size: 50px; color: red;">どぎゃーん!


このように、表現次第では無害な使われ方ですが、悪意を持ったことも出来るのは確かで、200pxあたりの文字列を並べられても困りどころです。
しかし、表現の幅が広がるとても便利な属性なので、厳密に判断できる処理を施し、解禁すると良いのではないでしょうか。はてなダイアリーの例が良い例です。
その他にも、脆弱性、危険性、迷惑性を含めた属性は色々とあります。が、そろそろ長ったらしく飽きてきたのでこの辺にしときます。

あと、特筆事項としては要素、span要素は、意味を持たない要素(要素は文章のセクションを分けるとかに使いますが)なので、基本的にダメという形にしておいたほうが良いかもしれません。この辺はポリシーに沿って許すかどうかを決めると良いかと思います。
また、フォント要素というものもあり、意味を持たない要素のことを指します。例えばfont要素、i要素、b要素、center要素などです。これらも意味を成さない要素なので除外すべき(現に最新のHTMLでは非推奨)ですが、初心者には扱いやすいので許可しておいても差し支えないのと思います。

そろそろ飽きたのでこの辺にしておこう。
まあHTMLは様々な要素がまだまだたくさんあります。一つ一つ精査して行くのが良いかとおもいます。<a href="http://diary.noasobi.net/flyson/xhtml_ref/index.html" title="XHTML リファレンス">XHTML リファレンスなどを見るとおおざっぱにHTMLの要素について分かるのではないかとおもいます。
XHTMLとHTMLの違いなどは、ここでは特に気にしなくても良いと思いますので説明しません。

ああ、長かった。

コメント3

  • お疲れぷろぐらま
    ありがとう。 キーワードはチェックはかけられるけど、 要素判定はしていなかったなぁ。 span は許可したいところなので、はてな程度の要素進呈が可能なレベルまで上げときます。 問題になりそうなのは判定に入れておきました。
  • お疲れぷろぐらま
    ここ見てアタックしてくる輩がいるので、 ちょっと控えといてくれ。 一応対策はしているけど、アドバイスも欲しいので、 メニューの中に板作っとく。
  • お疲れぷろぐらま
    タグ解析プログラムを実装する事にした。 1月中旬にはクリアできるかな。 現在はタグ消しでしてるけど、 許可タグのみ通過できるよう制作しているよ。