【PHP8.x】htmlspecialchars関数の使い方

作成日: 更新日:

htmlspecialchars関数は、HTMLの特殊文字をHTMLエンティティに変換することで、ウェブページ上での安全な文字列表示を実現する関数です。この関数は、主にクロスサイトスクリプティング(XSS)といったセキュリティ脆弱性からウェブサイトを保護するために使用されます。

具体的には、<(小なり記号)を&lt;に、>(大なり記号)を&gt;に、&(アンパサンド)を&amp;に、"(ダブルクォート)を&quot;に、'(シングルクォート)を&#039;にそれぞれ変換します。これにより、ユーザーからの入力データがHTMLコードとして解釈されることを防ぎ、悪意のあるスクリプトの実行や予期せぬレイアウトの崩れを防ぐことができます。

この関数は、ユーザーが入力したコメントや投稿内容など、外部から受け取ったデータをウェブページに表示する前に必ず適用することが推奨されます。セキュリティ対策の基本であり、ウェブアプリケーション開発において非常に重要な役割を担っています。

引数には変換したい文字列を渡すほか、$flags引数で変換する引用符の種類(例:ダブルクォートのみを変換するENT_COMPAT、シングルクォートとダブルクォートの両方を変換するENT_QUOTESなど)や、$encoding引数で入力文字列の文字エンコーディングを指定できます。これにより、柔軟な変換処理が可能です。htmlspecialchars関数を適切に利用することで、安全で堅牢なウェブアプリケーションを構築できるでしょう。

基本的な使い方

構文(syntax)

htmlspecialchars(
    string $string,
    int $flags = ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401,
    ?string $encoding = null,
    bool $double_encode = true
): string

引数(parameters)

string $string, int $flags = ENT_COMPAT | ENT_HTML401, ?string $encoding = null, bool $double_encode = true

  • string $string: エスケープ処理を行う対象の文字列
  • int $flags = ENT_COMPAT | ENT_HTML401: エスケープ処理の挙動を指定するフラグの組み合わせ
  • ?string $encoding = null: 文字コードを指定する文字列。nullの場合は内部エンコーディングを使用
  • bool $double_encode = true: HTMLエンティティが既にエスケープされている場合に、再度エスケープするかどうかを指定する真偽値

戻り値(return)

string

指定された文字列をHTMLエンティティに変換した結果の文字列を返します。

サンプルコード

PHPにおけるhtmlspecialcharsとデコード

<?php

/**
 * HTML特殊文字のエスケープとデコードのデモンストレーションを行います。
 *
 * この関数は、`htmlspecialchars` を用いてHTMLの特殊文字をエンティティに変換し、
 * その後 `htmlspecialchars_decode` を用いて元の文字に戻すプロセスを示します。
 * これは、Webアプリケーションにおけるクロスサイトスクリプティング (XSS) 攻撃の防止や、
 * HTMLコンテンツの安全な処理に不可欠な機能です。
 */
function demonstrateHtmlSpecialCharsUsage(): void
{
    // 1. エスケープとデコードを行う元の文字列を定義します。
    //    この文字列には、HTMLの特殊文字 (<, >, &, ", ') が含まれています。
    $originalString = "<p>ユーザー入力 & \"引用\" のテストです。'シングルクォート'も。</p>";
    echo "元の文字列: " . $originalString . PHP_EOL;

    // 2. htmlspecialchars() を使用して、HTMLの特殊文字をHTMLエンティティに変換します。
    //    - ENT_QUOTES: シングルクォートとダブルクォートの両方を変換対象とします。
    //    - ENT_HTML5: HTML5の仕様に従って変換します。
    //    - 'UTF-8': 文字列のエンコーディングを指定します。
    //    これは、ユーザーが入力したデータをWebページに安全に表示する際に非常に重要です。
    $escapedString = htmlspecialchars($originalString, ENT_QUOTES | ENT_HTML5, 'UTF-8');
    echo "エスケープ後の文字列: " . $escapedString . PHP_EOL;

    // 3. htmlspecialchars_decode() を使用して、HTMLエンティティを元のHTML特殊文字に戻します。
    //    `htmlspecialchars` と同じフラグを渡すことで、正しく元の状態に戻すことができます。
    //    これは、エスケープされたHTMLをプログラム内で処理したり、表示前に一時的に元に戻したりする場合に役立ちます。
    $decodedString = htmlspecialchars_decode($escapedString, ENT_QUOTES | ENT_HTML5);
    echo "デコード後の文字列: " . $decodedString . PHP_EOL;

    // 4. デコード後の文字列が元の文字列と一致するかを確認します。
    if ($originalString === $decodedString) {
        echo "結果: デコード後の文字列は元の文字列と完全に一致します。" . PHP_EOL;
    } else {
        echo "結果: デコード後の文字列は元の文字列と一致しません。" . PHP_EOL;
    }
}

// 関数を実行して、デモンストレーションを開始します。
demonstrateHtmlSpecialCharsUsage();

PHPのhtmlspecialchars関数は、Webアプリケーションにおいて、HTMLの特殊文字を安全な形式に変換するために使用される重要な関数です。具体的には、「<」、「>」、「&」、「"」、「'」といった文字を、Webブラウザで表示してもHTMLタグとして解釈されない「<」、「>」、「&」、「"」、「'」などのHTMLエンティティに変換します。これにより、ユーザーからの入力内容に悪意のあるスクリプトが含まれていたとしても、それがHTMLとして実行されることを防ぎ、クロスサイトスクリプティング(XSS)攻撃からアプリケーションを保護する非常に重要な役割を担っています。

この関数は、変換したい文字列を最初の引数に受け取ります。オプションとして、変換対象の文字の種類やHTMLのバージョン、文字列のエンコーディングを指定する引数も持ちます。関数は、特殊文字がエスケープされた新しい文字列を戻り値として返します。

サンプルコードでは、元の文字列をhtmlspecialcharsで安全な形式にエスケープした後、htmlspecialchars_decode関数を用いて、エスケープされた文字列を元の特殊文字に戻すデモンストレーションを行っています。htmlspecialchars_decodeは、htmlspecialcharsの逆の操作を行う関数で、HTMLエンティティを元の特殊文字に戻します。これにより、データがWeb上で安全に処理され、必要に応じてプログラム内で元の状態に戻せることを確認できます。システムエンジニアとして、Webアプリケーションのセキュリティを高める上で、これらの関数の理解は欠かせません。

htmlspecialcharsは、クロスサイトスクリプティング(XSS)攻撃を防ぐため、ユーザー入力をHTMLとして表示する直前に必ず利用してください。第3引数で'UTF-8'などの適切なエンコーディングを指定しないと、文字化けやセキュリティ問題の原因となります。第2引数のフラグではENT_QUOTESを指定し、シングルクォートやダブルクォートもエスケープすることで安全性が高まります。htmlspecialchars_decodeで元に戻す際は、htmlspecialcharsと同じフラグを指定しないと正しくデコードされません。このデコードは、エスケープ済みデータをプログラム内部で一時的に扱う場合などに限定して利用し、不必要に元のHTML構造を復元しないよう注意が必要です。

PHP htmlspecialcharsでXSS対策をする

<?php

// HTML特殊文字を含む可能性のある文字列の例
// ユーザーからの入力や外部データなどを想定します。
$unsafeInput = "<script>alert('Hello XSS!');</script> & \"テスト\" 'シングルクォート'";

echo "--- 変換前の文字列 ---" . PHP_EOL;
echo $unsafeInput . PHP_EOL . PHP_EOL;

// htmlspecialchars関数を使用して、HTML特殊文字をHTMLエンティティに変換します。
// これにより、Webブラウザで文字列が表示される際にスクリプトが実行されるのを防ぎ、
// XSS(クロスサイトスクリプティング)攻撃への対策となります。
//
// デフォルトの挙動では、 '&', '"', '<', '>' が変換されます。
// シングルクォートは変換されません。
$safeOutput = htmlspecialchars($unsafeInput);

echo "--- htmlspecialcharsで変換後の文字列 ---" . PHP_EOL;
echo $safeOutput . PHP_EOL;

?>

PHPのhtmlspecialchars関数は、HTML特殊文字をHTMLエンティティに変換するために使用されます。これは、WebアプリケーションにおけるXSS(クロスサイトスクリプティング)攻撃を防ぐ上で非常に重要なセキュリティ機能です。ユーザーからの入力など、外部から受け取った文字列をそのままWebページに出力すると、悪意のあるHTMLタグやスクリプトが実行されてしまう危険性があります。

サンプルコードでは、<script>alert('Hello XSS!');</script>のようなHTMLタグを含む文字列を$unsafeInputとして用意しています。この危険性のある文字列を最初の引数$stringとしてhtmlspecialchars関数に渡すことで、特殊文字を安全な形式に変換します。

具体的には、デフォルトの挙動でHTMLのタグを構成する<>、属性値を囲む"(ダブルクォート)、そしてHTMLエンティティの開始を示す&の4つの特殊文字を、それぞれ&lt;&gt;&quot;&amp;といったHTMLエンティティに変換します。これにより、ブラウザは変換された文字列を単なるテキストとして認識し、スクリプトとして実行することはありません。関数は変換された安全な文字列をstring型で戻り値として返します。

この関数には、変換する文字の種類を制御する$flags引数や、文字エンコーディングを指定する$encoding引数など、さらに詳細な挙動を設定するための引数も存在しますが、基本的には変換したい文字列を渡すだけで、Web表示におけるセキュリティを大きく向上させることができます。

htmlspecialchars関数はXSS攻撃対策としてHTML特殊文字を変換しますが、デフォルトではシングルクォート(')は変換されません。HTML属性値などで利用する際に安全性を高めるため、必要に応じて第2引数$flagsENT_QUOTESを指定してシングルクォートも変換するようにしてください。また、文字エンコーディングの指定は非常に重要です。第3引数$encodingには、サイトで使われている適切なエンコーディング(通常'UTF-8')を必ず明示的に指定し、文字化けやセキュリティの問題を防ぐようにしましょう。

【PHP8.x】htmlspecialchars関数の使い方 | いっしー@Webエンジニア