PHP

PHP エスケープ処理のためのhtmlspecialcharsの使い方

前回の記事「PHP フォームから値を取得する$_POSTの使い方」で出てきた、「htmlspecialchars」の使い方を見ていきます。

htmlspecialchars は、フォームから送られてきた値や、データベースから取り出した値をブラウザ上に表示する際に使用します。主に、悪意のあるコードの埋め込みを防ぐ目的で使われます。(エスケープと呼ばれます)

htmlspecialchars(エスケープする文字列, エスケープの種類, 文字コード);

第二引数、エスケープの種類

基本的に第二引数のエスケープの種類は一番強い(?) ENT_QUOTES を指定する形がいいと思います。
ENT_QUOTES を指定することで、下記にようなエスケープを行ってくれます。

  • 「"」(ダブルクォート)が「"」に変換されます。
  • 「'」(シングルクォート)が「'」または「'」に変換されます。
  • 「<」が「&lt;」に変換されます。
  • 「>」が「&gt;」に変換されます。

ENT_QUOTES 以外にも「ENT_COMPAT」や「ENT_NOQUOTES」等複数ありますが、ENE_QUOTESよりエスケープしてくれる文字が少ないので使用する機会はないように思います。

PHP フォームから値を取得する$_POSTの使い方」の記事で下記の例を作成しましたが、htmlspecialcharsを使用していますので、試しに「"」「'」「<」「>」を入力して送信してみてください。
送信完了ページのソースを確認してみると、エスケープされていることがわかると思います。

<?php
$firstName = "";
$lastName = "";
if ($_SERVER["REQUEST_METHOD"] === "POST") {
  if (!empty($_POST["first_name"]) && !empty($_POST["last_name"])) {
    $fullName = $_POST["last_name"] . " " . $_POST["first_name"];
  } else {
    $lastName = $_POST["last_name"];
    $firstName = $_POST["first_name"];
    $err = "入力されていない項目があります。";
  }
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>サンプル</title>
  <meta name="robots" content="noindex, nofollow" />
</head>
<body>
  <?php if (!isset($fullName)) : ?>
    <form action="" method="post">
      <p>姓: <input type="text" name="last_name" value="<?php echo htmlspecialchars($lastName, ENT_QUOTES, "UTF-8"); ?>"></p>
      <p>名: <input type="text" name="first_name" value="<?php echo htmlspecialchars($firstName, ENT_QUOTES, "UTF-8"); ?>"></p>
      <p style="color:red;"><?php echo $err; ?></p>
      <p><input type="submit" value="送信"></p>
    </form>
  <?php else : ?>
    <p>
      あなたの名前は <?php echo htmlspecialchars($fullName, ENT_QUOTES, "UTF-8"); ?> ですね。<br>
    </p>
    <p><a href="">戻る</a></p>
  <?php endif; ?>
</body>
</html>

» 実行結果

長いので・・・

毎回長い「htmlspecialchars(文字列, ENT_QUOTES, "UTF-8")」を記述すると見づらくなってしまうので、短い関数名にしてしまいましょう。
上の例のhtmlspecialcharsをhという関数にしてみました。

<?php

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

$firstName = "";
$lastName = "";
if ($_SERVER["REQUEST_METHOD"] === "POST") {
  if (!empty($_POST["first_name"]) && !empty($_POST["last_name"])) {
    $fullName = $_POST["last_name"] . " " . $_POST["first_name"];
  } else {
    $lastName = $_POST["last_name"];
    $firstName = $_POST["first_name"];
    $err = "入力されていない項目があります。";
  }
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>サンプル</title>
  <meta name="robots" content="noindex, nofollow" />
</head>
<body>
  <?php if (!isset($fullName)) : ?>
    <form action="" method="post">
      <p>姓: <input type="text" name="last_name" value="<?php echo h($lastName); ?>"></p>
      <p>名: <input type="text" name="first_name" value="<?php echo h($firstName); ?>"></p>
      <p style="color:red;"><?php echo $err; ?></p>
      <p><input type="submit" value="送信"></p>
    </form>
  <?php else : ?>
    <p>
      あなたの名前は <?php echo h($fullName); ?> ですね。<br>
    </p>
    <p><a href="">戻る</a></p>
  <?php endif; ?>
</body>
</html>

短くなって見やすくなったのではないでしょうか。

最後に・・・

PHPを使用する上でエスケープ処理は必須なので、必ず行うようにしましょう。

-PHP