PHPでのHTMLエスケープ
更新日 : 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対策は、送られてきたデータを表示する際には息をするように使いましょう。
エスケープ自体はこの関数を使うだけでいいので忘れないように気をつけましょう。
しかし、この関数自体名前が長い点、この関数の第二引数、第三引数はほぼ変更せず使うことが多い点を考えると、もっと単純な関数として自分で定義しておくのが使いやすくおすすめです。
タグ
-
前の記事
PHPでのPOSTデータの受け取り
-
次の記事
PHPでのCookieの利用