[cakephp2]h関数の定義場所

投稿者: | 2017年6月17日

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は実行されずにそのまま表示されます。