※ ChatGPTを利用し、要約された質問です(原文:$_GETで受け取った値に対して、htmlspecialchars()した時の謎なふるまいについて。)
$_GETで受け取った値のhtmlspecialchars()の謎なふるまいについて
このQ&Aのポイント
PHP5、SQLite3、Firefoxの環境で、謎の挙動が発生しています。
htmlspecialchars()を使用した場合、特定の文字列の変換結果が予想と異なることがあります。
さらに、sqlite_escape_string()を使用した後のhtmlspecialchars()では、さらなる予想外の変換結果が生じます。
$_GETで受け取った値に対して、htmlspecialchars()した時の謎なふるまいについて。
//(環境)PHP5、SQLite3、Firefox
<?php
echo $_GET["page"]; //(1)何も出力されない。
$_GET["page"] = htmlspecialchars(sqlite_escape_string($_GET["page"]));
echo $_GET["page"]; //(2)<br>と出力されてしまった。
?>
上記スクリプト index.php に対し、
ブラウザURL記入欄にて、
http://example.com/index.php?page=<br>
と、ゲットで値「<br>」を与えたURLを打ち込んだところ、
上記ソースのコメントに書いたような出力結果となりました。
私の予想では、
(1)では、<br> を、
(2)では、<br> を、
それぞれ出力するものと思っていましたが、結果は全く違いました。
これはなぜなのでしょう?
さらに、
上記において、
$_GET["page"] = htmlspecialchars($_GET["page"]);
としても、結果は同じでした。
------------------------------
また、
$_GET["page"] = htmlspecialchars(sqlite_escape_string($_GET["page"]));
の場合に、
ゲットで渡す値を「<br>」から「<'br'>」へ変えてみると、
(1)では、<'br'>を、
(2)では、<''br''>を、
それぞれ出力しました。
------------------------------
どなたか、分かりましたら教えて下さい。
よろしくお願い致します。
お礼
簡潔明瞭な回答をありがとうございます。 まず、回答を見て、「ん?」と一瞬思いましたが、 すぐに自分の愚かさに気付きました。(はずかしっ) (1)で、<br>が出力されていれば、 当然、ブラウザ上では表示されませんよね・・・。 次に、(2)については、 <br>と出力されているからこそ、 ブラウザ上では、<br>と表示されるわけですよね・・・。 至極当然のことを、さも難問であるかのように質問していた数分前の自分が恥ずかしい。 穴が有ったら、入りたいです。 echo(出力)されたものは、 「見てくれ」はどうであれ、必ずブラウザに表示されるものと思っていたのですが、これが大きな間違いでした。 出力されたものが、 ソースでは表示されるが、ブラウザには表示されない という場合があることを、改めて理解しました。 分かっていたつもりでしたが、思わぬ墓穴を掘りました。 ちょうど、穴があったら入りたいと思っていたところなので、 今は、この掘った墓穴が、気になってしかたありません。 では、どうもありがとうございました。