昔のCGIやPHPなどでよくある例だが,ロジックを記述したソースコード中にHTMLの生成コードをついつい書いてしまう人がいる。しかし,ソースコードにHTML生成コードを含めてはいけない。

 なぜHTMLの生成コードをソースコード中に書いてはいけないのか。いくつか例を挙げてみる。

可読性が下がる

 「ヒアドキュメント」をご存じだろうか。シェルスクリプトに由来する記法で,改行を含んだ複数行の文字列を一つの文字列として扱える。このヒアドキュメントを使ってHTMLの構成要素のパーツを構築し,最終的にそれらを連結して一つの出力とするようなコードが数年前までよく書かれていた。今でも,そのようなコードをしばしば見ることがある。

 これだと,アプリケーションの制御部の中にHTMLが混じることになる。制御という点で全く本質では無いコードがソースコードの複数行を占拠することになってしまうわけだ。これは読みづらい。

 ヒアドキュメント以外にも,PHP,ASP,JSPなどではHTMLをベースに,その中にコードを混在させるような記述が可能である。下手をすると,HTMLの中にクラスや関数の定義などが場当たり的に登場することになってしまう。長期にわたってそのようなコードを保守するのは困難だろう。HTML生成コードは,できる限り制御部から切り離して記述すべきである。

セキュリティのリスクが高まる

 ヒアドキュメントやPHP,ASP,JSPを使ってHTMLを生成する場合,もう一つ注意しなければならないのはXSS(クロスサイト・スクリプティング)などセキュリティの問題である。一般的には,問題となる文字列を出力時にサニタイズ(無効化)することで対策する。

 ヒアドキュメントは文字列を複数行にわたって扱うことができるので,例えば「特定のHTMLの要素を許可して,それ以外の要素は許可しない」といった要件を満たさねばならないときに扱いづらくなる。本来許可すべきでない要素に対して許可してしまうと,サニタイズがうまくいかず,XSSに対する脆弱性を生んでしまうこととなるかもしれないのだ。

 そういうリスクを減らすには,テンプレート・エンジンを使うとよい。テンプレート・エンジンとは,テキストを整形し出力するためのエンジンのこと。XSS対策に有効なサニタイズを行う手法も用意されているので,簡単にXSS対策を施すことができる。PerlならTemplate Toolkit,PHPであればSmartyなどを使うとよい。各種言語でテンプレート・エンジンは複数あるので,好みのものを利用すればよいだろう。


山口徹
サイボウズ・ラボ
 サイボウズ・ラボ株式会社のプログラマ。バーテンダーからIT業界に転身後,様々なWeb制作を行い,大規模コミュニティ・サイトの開発・運用を経て,現在は研究開発の日々。Perl使い。Perlを中心とした開発のノウハウやネタをShibuya Perl Mongersのイベントで発表するなど講演活動も行う。個人の開発日記は「Yet Another Hackadelic」。仕事のブログは「log4ZIGOROu」。