[PHP]htmlspecialchars()を行った上でprintf()する

Pocket

PHP で html を出力するする際、htmlspecialchars() を使ってクロスサイトスクリプティング(XSS)対策を行うのは基本的ですが、printf() や sprintf() で出力をする場合全ての値に htmlspecialchars() を行うと可読性が著しく下がってしまうので、特殊文字を変換した上で printf()、sprintf() をするための関数を作ってみました。

<?php
printfh('<a href="%s" class="%s">%s</a>',
	'https://php-archive.net','sample', '<test>');

function printfh(){
	$args = func_get_args();
	$text = array_shift($args);
	$args = array_map('h', $args);
	vprintf($text, $args);
}

function sprintfh(){
	$args = func_get_args();
	$text = array_shift($args);
	$args = array_map('h', $args);
	return vsprintf($text, $args);
}

function h($str, $encoding=null){
	if(empty($encoding)) $encoding = mb_internal_encoding();
	$str = htmlspecialchars($str, ENT_QUOTES, $encoding);
	return $str;
}
実行結果: 
<a href="https://php-archive.net" class="sample">&lt;test&gt;</a>

使い方は printf() などとほぼ同じです。
第一引数にフォーマットを記入し、第二引数以降に代入する文字を追加していきます。(可変長引数)


Similar Posts:




コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です