PHPのパーセントエンコーディングとHTMLエスケープ : PHP

Pocket

パーセントエンコーディング

URLクエリはパーセントエンコードされる。
※ここではURLの?以降のクエリだけ考える。

http://example.com/index.php?key=<a>

アドレス欄に上記URLを入力してリクエストする。
ユーザーエージェント(ブラウザ)はURLクエリをパーセントエンコーディングしてリクエストする。
HTTPヘッダ(のリクエスト・ライン)は下記のようになる。

GET /index.php?key=%3Ca%3E HTTP/1.1

※ <のパーセントエンコーディングは%3C, >は%3E。

上記リクエストに対する$_SERVER[‘REQUEST_URI’]、$_GET[‘key’]の値は下記のようになる。

$_SERVER['REQUEST_URI']は/index.php?key=%3Ca%3E
$_GET['key']は<a>

HTMLエスケープ

HTMLで制御文字を表す&, >, <, “, ‘を文字参照へ変換する。

PHPはHTMLエスケープのためのhtmlspecialchars関数がある。
htmlspecialchars($output, ‘ENT_QUOTES’, ‘UTF-8’);
htmlspecialchars

  • &は&amp;
  • >は&gt;
  • <は&lt;
  • “は&quot:
  • ‘は&#039;(数値参照)

HTMLアンエスケープ

  • &amp;は&
  • &gt;は>
  • &lt;は<
  • &quot;は”
  • &#039;(数値参照)は’

inputやtextareaのvalue属性値にHTMLエスケープした値が設定されたときブラウザはアンエスケープして表示する。

<input type="text" value="&lt;a&gt;">

上記はinputエリアには<a>と表示される。

htmlspecialcharsでエスケープした値をinputやtextareaに設定したときも表示されるときはアンエスケープされる。

&lt;?php
if (isset($_GET['key']) === true) {
    $value = $_GET['key'];
    $escapeValue = htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
}
echo '<!DOCTYPE html>', PHP_EOL;
echo '<html lang="ja">', PHP_EOL;
echo '<head>', PHP_EOL;
echo '<meta charset="utf-8">', PHP_EOL;
echo '<title>Query And Encoding</title>', PHP_EOL;
echo '</head>', PHP_EOL;
echo '<body>', PHP_EOL;
if (isset($escapeValue)) {
    echo $escapeValue . '<br>', PHP_EOL;
}
echo &lt;&lt;<EOF
    <form action="" method="GET">
    <input type="text" name="key" value="{$escapeValue}">
    <input type="submit" value="送信" />
    </form>
EOF;
echo '</body>', PHP_EOL;
echo '</html>', PHP_EOL;

※ magic_quotes_gpcが有効な場合はクォート’, “が自動でエスケープされる。
ini_setでは変更できないのでhtaccessで無効にした。

php_flag magic_quotes_gpc off

コメント

No comments yet.

コメントの投稿

改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。