PHPでのデータの受け取りを、GETメソッドやPOSTメソッドで行いました。 今回は受け取ったデータを表示する際に行うべきHTMLエスケープについて学びます。HTMLエスケープはXSS対策のために行うべき処理で、これを行わないとサーバーやクライアントに問題を引き起こすことになりかねません。

PHPでのHTMLエスケープ

3年以上前に更新されました。情報が古い可能性があります。
更新日 : 2019年04月17日

PHPでのデータの受け取りを、GETメソッドやPOSTメソッドで行いました。

今回は受け取ったデータを表示する際に行うべきHTMLエスケープについて学びます。HTMLエスケープはXSS対策のために行うべき処理で、これを行わないとサーバーやクライアントに問題を引き起こすことになりかねません。

PHPでのXSS対策

クロスサイトスクリプティングは悪意のあるスクリプトを実行してしまう恐れがあります。PHPでその対策としてHTMLエンティティに変換するための処理を行っていきましょう。

GETリクエストを受け取り単純に表示する処理

XSS対策を学ぶために、簡単なPHPファイルを作成してみましょう。

<!DOCTYPE html>
<html lang="jp">
<head>
	<meta charset="utf-8">
	<title>PHPでのHTMLエスケープ</title>
	<?php
		$data = $_GET["data"];
	?>
</head>
<body>
	<header>
		<h1>エスケープして表示してみよう</h1>
	</header>
	<?php
		$data = htmlspecialchars($data, ENT_QUOTES, 'UTF-8');
		echo "「{$data}」というデータを受け取りました。HTMLエスケープ済みです。";
	?>
</body>
</html>

こちらのPHPにdataというキーでGETデータを送ってみます。HTMLエンティティへの変換を行っているので、データの一部をHTMLタグにしても問題ありません。

実行結果は以下のようになります。

h2タグをデータに含めて送りましたが、きちんとそれ自体が文字として表示されています。

PHPでのHTMLエスケープ関数

コードを見ればわかりますが、PHPでHTMLエンティティに変換してくれる関数がhtmlspecialchars関数です。書式を見ておきましょう。

htmlspecialchars(変換したい文字列[string], 変換方式[int], 文字コード[string]) : string

HTMLエスケープしたい文字列を第一引数に代入します。
第二引数はENT_QUOTES、第三引数は'UTF-8'固定で問題ありません。それぞれ変換する際の設定と文字コードを指定します。

これで悪意のあるスクリプトがデータとして送られてきても、コードとして認識されずに単純な文字としてデータを扱ったりすることが可能です。

まとめ

XSS対策は、送られてきたデータを表示する際には息をするように使いましょう。

エスケープ自体はこの関数を使うだけでいいので忘れないように気をつけましょう。

しかし、この関数自体名前が長い点、この関数の第二引数、第三引数はほぼ変更せず使うことが多い点を考えると、もっと単純な関数として自分で定義しておくのが使いやすくおすすめです。