(PHP) htmlspecialchars()を使って特殊文字をエスケープする

(PHP) htmlspecialchars()を使って特殊文字をエスケープする

 

本記事では、
htmlspecialchars()を使って、HTML タグなどに使われる特殊文字をエスケープする方法を解説していく。特殊文字をエスケープすることで、XSS や悪意のあるスクリプトによる攻撃を防ぐことが可能だ。

 

(最初に) 特殊文字をエスケープする意味

最初になぜ特殊文字をわざわざエスケープする必要があるのかという点を解説する。

htmlspecialchars()を使ってHTML の特殊文字をエスケープする目的は、
主に XSS(クロスサイトスクリプティング)攻撃を防ぐことだ。

例えば、ユーザーによる入力項目を受け取って画面に出す場合など、エスケープをしないとHTML タグやスクリプトがそのまま実行されてしまうため危険である。

以下の例を見てほしい。

<?php

$sex = '男';
$age = '13';
$color = '<span style="color:red; font-size:50px;">赤</span>';

echo '性別は' . $sex . 'です';
echo '<br>';
echo '年齢は' . $age . 'です';
echo '<br>';
echo '好きな色は' . $color . 'です';

■実行結果(画面)

htmlspecialcharで特殊文字をエスケープする画像

 

$sex, $age, $color がそれぞれユーザの入力文字を受け取ったものと考えて貰えば良い。

$colorだけが純粋な文字列ではなく、htmlタグを用いた特殊な文字列であるため、画面の表示が入力ユーザの意図どおりになってしまっているのがわかるだろう。悪意のあるユーザであれば、さらに危険性の高いスクリプトを埋め込んでくることが可能であり、セキュリティ面で非常に脆弱である。

この様な、ユーザからの特殊な文字列やスクリプトを無効化するためにhtmlspecialchars()関数は存在するというわけだ。

 

htmlspecialchars() の使い方

前置きが長くなったが、ここから実際に、
htmlspecialchars()の使い方を解説していく。

 

htmlspecialchars()の書式

htmlspecialchars()の書式は以下の様になっている。

htmlspecialchars([エスケープする文字列], ENT_QUOTES|ENT_HTML5, "UTF-8");

第一引数はエスケープする文字列を指定する。

第二引数はエスケープの方法を指定する。デフォルトは「 ENT_COMPAT | ENT_HTML401 」だが、
基本的に「 ENT_QUOTES 」を指定する(※ENT_QUOTES 以外に指定可能な値は後述する)

第三引数は、エンコードする文字コードを指定する。省略した場合には、 PHP のバージョンによってデフォルト値が変わってくる。PHP 5.6.0 以降であれば default_charset が使用され、default_charset のデフォルトは UTF-8。PHP 5.4 以前の default_charset のデフォルト値は ISO-8859-1となっている。

 

第二引数(エスケープの方法)の種類

第二引数のエスケープの方法に指定できる値は以下のようなものが存在する。

ENT_COMPAT ダブルクオートはエスケープするが、シングルクオートはしない
ENT_QUOTES ダブルクオートもシングルクオートも両方エスケープする
ENT_NOQUOTES ダブルクオートもシングルクオートもエスケープしない
ENT_HTML401 HTML 4.01 として処理
ENT_HTML5 HTML 5 として処理

 

その他は、公式ドキュメント 参照

 

エスケープされる文字の種類

サンプルではhtmlタグでの悪意のあるスクリプトを紹介したが、
以下の様なhtml特殊文字列もエスケープ可能だ。

特殊文字  エスケープ後
& (アンパサンド) &amp;
” (ダブルクォート) &quot;
 (シングルクォート) &#039;( ENT_HTML401 )または、&apos;( ENT_XML1、ENT_XHTML 、 ENT_HTML5 )
< (小なり) &lt;
> (大なり) &gt;

 

 

おまけ:htmlspecialchars()は、関数化すると使いやすい

htmlspecialchars()は、結構それだけで記述量がいる関数だ。

そのため、よく使い回せる様に、関数化してしまうことが多い。

function h($str) {
    return htmlspecialchars($str, ENT_QUOTES|ENT_HTML5, "UTF-8");
}

// HTMLに出力する際
echo h('<hoge>');

 

 

関連記事

(PHP) formで配列をPOSTする
(PHP) 全マジック定数の 使い方一覧 【__FILE__や__DIR__など】

https://www.php.net/manual/ja/function.htmlspecialchars.php

https://qiita.com/hyuy/items/a1b64c5902eb130a2530

 

記事が気に入った方はシェアをお願いします!

コメントを残す

メールアドレスが公開されることはありません。