Webアプリケーションでユーザーの入力した文字列を出力する際、HTML特殊文字をエスケープしておかないとクロスサイトスクリプティングやスクリプト挿入攻撃といった脆弱性につながります。PHPでは、HTML特殊文字をエスケープするhtmlspecialchars()関数やHTMLタグを削除するstrip_tags()関数が定義されており、これらの関数を使用することで簡単に対応することができます。
HTML特殊文字をエスケープする htmlspecialchars()
htmlspecialchars()は、第1引数で渡された文字列内のHTML特殊文字をエスケープして返します。第2引数は、デフォルト値のENT_COMPAT定数ではシングルクォートがエスケープされないので、ENT_QUOTES定数を指定します。第3引数は文字コード、第4引数は既にエスケープされている特殊文字を重複してエスケープするかをBool値で指定します。初期値のtrueの場合、&は&に変換されます。
PHP
<?php
$html = '<script type="text/javascript">alert("scriptを挿入されました");</script>';
echo htmlspecialchars($html, ENT_QUOTES, 'UTF-8', false);
/* 出力:
<script type="text/javascript">alert("scriptを挿入されました");</script>
*/
?>
エスケープされたHTML特殊文字をデコードする htmlspecialchars_decode()
htmlspecialchars_decode()は、エスケープされたHTML特殊文字をデコードします。第1引数に対象となる文字列を渡し、第2引数ではダブルクォート・シングルクォートの扱いをquote_style定数で指定します。デフォルトのENT_COMPAT定数はダブルクォートのみを変換し、ENT_QUOTES定数はダブルクォート・シングルクォートを変換します。ENT_NOQUOTES定数は、どちらも変換しません。
PHP
<?php
$html = '<a href="https://kudox.jp/">kudox.jp</a>';
echo htmlspecialchars_decode($html, ENT_QUOTES);
/* 出力:
<a href="https://kudox.jp/">kudox.jp</a>
*/
?>
文字列からHTMLタグ・PHPタグを取り除く strip_tags()
strip_tags()は、第1引数で渡された文字列からHTMLタグ・PHPタグ・Nullバイトを取り除いた文字列を返します。第2引数は省略可能で、取り除かないタグを文字列で指定することができます。
PHP
<?php
$str = <<<EOF
<?php echo 'PHP'; ?>
<p>
Hello<br />
World.
</p>
EOF;
echo strip_tags($str, '<br>');
/* 出力:
Hello<br />
World.
*/
?>
改行コードの直前に<br />を挿入する nl2br()
nl2br()は、第1引数で渡した文字列内の改行コードの直前に<br />を挿入します。PHP 5.3以降では、第2引数でfalseを渡すと挿入するタグを<br>にすることができます。
PHP
<?php
$html = <<<EOF
テキストテキスト
テキストテキスト
EOF;
echo nl2br($html);
/* 出力:
テキストテキスト<br />
テキストテキスト
*/
?>