cakephp2では、xss(クロスサイトスクリプティング)対策でh関数というものが定義されています。
どこに定義されているのかは、
lib/Cake
配下の
basic.php
に定義されています。
以下のような関数です。
function h($text, $double = true, $charset = null) {
if (is_string($text)) {
//optimize for strings
} elseif (is_array($text)) {
$texts = array();
foreach ($text as $k => $t) {
$texts[$k] = h($t, $double, $charset);
}
return $texts;
} elseif (is_object($text)) {
if (method_exists($text, '__toString')) {
$text = (string)$text;
} else {
$text = '(object)' . get_class($text);
}
} elseif (is_bool($text)) {
return $text;
}
static $defaultCharset = false;
if ($defaultCharset === false) {
$defaultCharset = Configure::read('App.encoding');
if ($defaultCharset === null) {
$defaultCharset = 'UTF-8';
}
}
if (is_string($double)) {
$charset = $double;
}
return htmlspecialchars($text, ENT_QUOTES, ($charset) ? $charset : $defaultCharset, $double);
}
なぜh関数を使う必要があるのか。
例えば
<?= '<script>alert("aaa")</script>' ?>
だと、javascriptのalertが実行されて、ウインドウが立ち上がりaaaと表示されてしまいます。
<?= h('<script>alert("aaa")</script>') ?>
とサニタイズ(無害化)してあげると、javascriptは実行されずにそのまま表示されます。