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で制御文字を表す&, >, <, “, ‘を文字参照へ変換する。
PHPはHTMLエスケープのためのhtmlspecialchars関数がある。
htmlspecialchars($output, ‘ENT_QUOTES’, ‘UTF-8’);
htmlspecialchars
inputやtextareaのvalue属性値にHTMLエスケープした値が設定されたときブラウザはアンエスケープして表示する。
<input type="text" value="<a>">
上記はinputエリアには<a>と表示される。
htmlspecialcharsでエスケープした値をinputやtextareaに設定したときも表示されるときはアンエスケープされる。
<?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 <<<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.
改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。