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.
改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。