特殊文字を HTML エンティティに変換
& (アンパサンド)
" (ダブルクォート)
' (シングルクオート)
< (小なり)
> (大なり)
は、HTML において特殊な意味を持つ文字です。
これらの文字をそのまま HTML として表示することは、
悪意ある攻撃コードを実行してしまう危険を生じます。
PHP では htmlspecialchars という関数を使うことで、
これらの特殊文字を HTML エンティティに変換できます。
HTML エンティティとは、
たとえばアンパサンドなら & です。
このように記述することで、表示上は & と表示されますが、
アンパサンドとしては機能しなくなります。
HTML エンティティに変換して特殊文字を除去することで
悪意ある攻撃コードを無効化することは、
もっとも基本的なセキュリティ対策です。
hsc メソッド
htmlspecialchars という関数は長くて引数の指定も面倒なので、
Rampart では hsc というメソッドを用意しています。
$ramp->hsc(str);
引数に文字列を指定した場合、
$ramp->hsc(array);
それに htmlspecialchars を適用した文字列を返します。
引数に配列を指定した場合、
配列のすべての要素に htmlspecialchars を適用した配列を返します。
// htmlspecialchars の第三引数に指定する文字セットとして
// setEncoding で指定した文字コードが使用される。
$ramp->setEncoding("UTF-8");
// 次の例では、"<br />" はHTMLエンティティに変換され
// "<br />" となる。
echo $ramp->hsc("<br />");
// もちろん、引数には変数も指定できる。
// 結果は上の例と同じ。
$val = "<br />"
$val = $ramp->hsc($val);
echo $val;
// 配列に適用する。
$vals = array("<1>", "<2>");
$vals = $ramp->hsc($vals);
// Array([0] => <1> [1] => <2>)
// が出力される。
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エンティティ変換した "<br />" が出力される。
// (つまり、改行タグではなく <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" => "<1>", "key2" => "<2>")
// となる。
print_r($getval);
// 引数を指定しない場合も、getHsc は以下のように
// get して hsc するのと同じ。
$val = $ramp->get();
print_r( $ramp->hsc($val) );
補足
テンプレートファイルを使用して出力する場合は、
Rampart が自動的に hsc を適用して出力するので、
明示的に HTML エンティティ変換をする必要はありません。