特殊文字を HTML エンティティに変換

& (アンパサンド)
" (ダブルクォート)
' (シングルクオート)
< (小なり)
> (大なり)
は、HTML において特殊な意味を持つ文字です。

これらの文字をそのまま HTML として表示することは、
悪意ある攻撃コードを実行してしまう危険を生じます。

PHP では htmlspecialchars という関数を使うことで、
これらの特殊文字を HTML エンティティに変換できます。

HTML エンティティとは、
たとえばアンパサンドなら &amp; です。
このように記述することで、表示上は & と表示されますが、
アンパサンドとしては機能しなくなります。

HTML エンティティに変換して特殊文字を除去することで
悪意ある攻撃コードを無効化することは、
もっとも基本的なセキュリティ対策です。

hsc メソッド

htmlspecialchars という関数は長くて引数の指定も面倒なので、
Rampart では hsc というメソッドを用意しています。

$ramp->hsc(str);
$ramp->hsc(array);
引数に文字列を指定した場合、
それに htmlspecialchars を適用した文字列を返します。
引数に配列を指定した場合、
配列のすべての要素に htmlspecialchars を適用した配列を返します。

// htmlspecialchars の第三引数に指定する文字セットとして
// setEncoding で指定した文字コードが使用される。

$ramp->setEncoding("UTF-8");

// 次の例では、"<br />" はHTMLエンティティに変換され
// "&lt;br /&gt;" となる。

echo $ramp->hsc("<br />");

// もちろん、引数には変数も指定できる。
// 結果は上の例と同じ。

$val = "<br />"
$val = $ramp->hsc($val);
echo $val;

// 配列に適用する。
$vals = array("<1>", "<2>");
$vals = $ramp->hsc($vals);

// Array([0] => &lt;1&gt; [1] => &lt;2&gt;)
// が出力される。

print_r($vals);

getHsc メソッド

set 系メソッドでセットした変数の値を取得するメソッドは get ですが、
getHsc というメソッドを使用すると
get で取得する値に hsc を適用して取得することができます。

$ramp->getHsc();
$ramp->getHsc(key);
引数には取得する変数のキーを指定します。
引数を省略した場合は、
セットされているすべての変数が連想配列として取得できます。

// "key" に "<br />" をセット。
echo $ramp->set("key", "<br />");

// 通常の get だと "<br />" がそのまま出力される。
// (つまり、改行タグとして表示される)

echo $ramp->get("key");

// getHsc を使うと "key" の値を
// HTMLエンティティ変換した "&lt;br /&gt;" が出力される。
// (つまり、改行タグではなく <br /> と表示される)

echo $ramp->getHsc("key");


// getHsc は、以下のように
// get して hsc するのと同じ。

$val = $ramp->get("key");
echo $ramp->hsc($val);

getHsc を引数なしで使用した場合の例。 // たとえば、次のような連想配列がセットされている場合。
$vals = array(
     "key1" => "<1>"
    ,"key2" => "<2>"
);
$ramp->setFromArray($vals);

// すべての値に hsc を適用して取得する。
$getval = $ramp->getHsc();

// 取得した $getval の値は、
// array("key1" => "&lt;1&gt;", "key2" => "&lt;2&gt;")
// となる。

print_r($getval);


// 引数を指定しない場合も、getHsc は以下のように
// get して hsc するのと同じ。

$val = $ramp->get();
print_r( $ramp->hsc($val) );

補足

テンプレートファイルを使用して出力する場合は、
Rampart が自動的に hsc を適用して出力するので、
明示的に HTML エンティティ変換をする必要はありません。