$_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)では、&lt;br&gt; を、 それぞれ出力するものと思っていましたが、結果は全く違いました。 これはなぜなのでしょう? さらに、 上記において、 $_GET["page"] = htmlspecialchars($_GET["page"]); としても、結果は同じでした。 ------------------------------ また、 $_GET["page"] = htmlspecialchars(sqlite_escape_string($_GET["page"])); の場合に、 ゲットで渡す値を「<br>」から「<'br'>」へ変えてみると、 (1)では、<'br'>を、 (2)では、<''br''>を、 それぞれ出力しました。 ------------------------------ どなたか、分かりましたら教えて下さい。 よろしくお願い致します。

  • march4
  • お礼率83% (628/754)
  • PHP
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

ブラウザの画面ではなくソースを表示して確認されましたか

march4
質問者

お礼

簡潔明瞭な回答をありがとうございます。 まず、回答を見て、「ん?」と一瞬思いましたが、 すぐに自分の愚かさに気付きました。(はずかしっ) (1)で、<br>が出力されていれば、 当然、ブラウザ上では表示されませんよね・・・。 次に、(2)については、 <br>と出力されているからこそ、 ブラウザ上では、<br>と表示されるわけですよね・・・。 至極当然のことを、さも難問であるかのように質問していた数分前の自分が恥ずかしい。 穴が有ったら、入りたいです。 echo(出力)されたものは、 「見てくれ」はどうであれ、必ずブラウザに表示されるものと思っていたのですが、これが大きな間違いでした。 出力されたものが、 ソースでは表示されるが、ブラウザには表示されない という場合があることを、改めて理解しました。 分かっていたつもりでしたが、思わぬ墓穴を掘りました。 ちょうど、穴があったら入りたいと思っていたところなので、 今は、この掘った墓穴が、気になってしかたありません。 では、どうもありがとうございました。

関連するQ&A

  • htmlspecialchars()について

    htmlspecialchars()関数で、クエリー文字列をHTMLエンティティーに変換してるはずなのですが、中身をダンプしたり、ジャンプしたページのクエリーを見ても、変換されておらず、生の 引数が表示されています。どうすれば、%2ケタなどの文字列で表示されるのか、ご指導お願い致します。スクリプトは下記のようなものです。なお、encoder.php, decoder.php は、両方UTF-8でエンコードしたスクリプトです。 --------------------------------------------------------------------------------------------------------- ジャンプ元:[encoder.php] <!doctype html> <html> <head><title>URLエンコード</title> <meta charset="UTF-8"> </head> <body> <br><br> <center> <?php $input = "空条"; $from = 1; $input2 = urlencode($input); $from2 = urlencode($from); $query_string = 'name='.$input2.'&from='.$from2; echo '<a href="decoder.php?'.htmlspecialchars($query_string, ENT_QUOTES, 'UTF-8').'">エンコード</a>'; ?> </center> </body> </html> -------------------------------------------------------------------------------------------- ジャンプ先「decoder.php」 <?php $name1 = $_GET['name']; $from1 = $_GET['from']; $name2 = urldecode($_GET['name']); $from2 = urldecode($_GET['from']); echo 'デコード前 '; echo '名前:'.$name1.' フロム:'.$from1.'<br>'; echo 'デコード後 '; echo '名前:'.$name2.' フロム:'.$from2; ?>

    • 締切済み
    • PHP
  • html用とmysql用のエスケープ処理の両立方法

    一度htmlspecialcharsしたものをmysql_real_escape_stringしてはいけない、そうです。 下記のように$pageをブラウザに表示もして、mysqlでも使う場合はどうするのでしょうか。 先にmysql_real_escape_stringを使い終わった後に、 htmlspecialcharsを使うような構造になるように工夫するのでしょうか。 htmlspecialcharsは出力する直前に使用しなければならないですが、 mysql_real_escape_stringは直前でなくても構わないとのことなので そこも意識して・・・ $mysql = mysql_connect($HostName,$UserName,$Password); $page = mysql_real_escape_string($_GET['page']); $mysql_c = "SELECT * FROM tttttt WHERE page='$page'"; $mysql_q = mysql_query($mysql_c,$mysql); $page = htmlspecialchars($_GET['page']); $html = '<a href="?page='.$page.'">'.$page.'</a>'; <html> <body> <div><?php echo $page; ?></div> 他には方法がないのでしょうか。

    • ベストアンサー
    • PHP
  • 関数htmlspecialcharsと関数sqlite_escape_stringの扱い方

    いつもお世話になっております。 環境:PHP5/SQLite3 関数 htmlspecialchars 関数 sqlite_escape_string サイトのセキュリティを考慮し、 上記2関数をなんとなく利用しているのですが、 この「なんとなく」を卒業したいと思っています。 アドバイスして頂きたい内容を書きますと、下記のようになります。 ---------------------------------------- 上記の2関数のうまい使い分けと言いますか、 「こういう時にはこっち!ああいう時には、あっち! んでもって、 これこれこういう時には、どっちも使え!」 ---------------------------------------- というようなアドバイスを期待しております。 DBのクエリ文に使用しないような場合でも、 sqlite_escape_string関数で浄化しておいて損はないように思うのですが、 そういう使い方だと何か問題はありますでしょうか。 (無視できるような小さな問題であれば、気にしないつもりです。) 浄化能力を包含関係で考えると、 htmlspecialchars ⊂ sqlite_escape_string と私は考えていますが、違いますでしょうか。 それと、これらの関数の、 使うタイミングと使う際の注意事項 についても、あれこれお話し頂けると嬉しいです。 具体例(コードorシチュエーション)を示して頂けると助かります。 他にも、こんな関数でも浄化できます、 というようなアドバイスも大歓迎です。 と、とても抽象的な質問文になりましたが、、、 どなたか、「ワンポイントアドバイス」でも結構ですので、 どうか宜しくお願い致します。

    • 締切済み
    • PHP
  • sqlite_fetch_sinleの処理が謎である件。(sqlite_fetch_arrayと比較)

    //処理 ~ 省略 ~ $result = sqlite_query($sql,$db_res); $info = sqlite_fetch_■■■■($result,SQLITE_ASSOC); $page_num = $info['page_num']; //以下、チェック文 //チェック(1) echo var_dump($info); echo "<br>"; //チェック(2) echo var_dump($page_num); echo "<br>"; //チェック(3) print_r($info); echo "<br>"; //チェック(4) echo $page_num."<br>"; //--------------------------------- // ブラウザに表示される内容↓ //--------------------------------- //--------------------------------- <■■■■が、singleの場合> string(3) "200" string(1) "2" 200 2 //--------------------------------- <■■■■が、arrayの場合> array(1) { ["page_num"]=> string(3) "200" } string(3) "200" Array ( [page_num] => 200 ) 200 //--------------------------------- 私は、singleを使って、 echo $page_num; によって、「200」を 得たかったのですが、「2」が出てきてしまい、 困ってしまいました。 これは、なぜなんでしょう? singleの仕組みがよく分かりません。 ※arrayを使えば、結果的には問題は解決するのですが、  singleの、この謎を解きたいがために、質問しました。 よろしくお願い致します。 (質問とは関係ありませんが、このサイト、現在かなり重くないでしょうか?)

    • ベストアンサー
    • PHP
  • エスケープ処理

    どうも初めまして。 switch文を用いてページを振り分けてますが、 この場合$_GETはhtmlspecialcharsでエスケープ処理するべきでしょうか?それともSQL構文が入力されることも考えられるのでmysql_real_escape_string()も使うべきなのでしょうか? ああ混乱してます><; どなたか、よろしくお願いします if(isset($_GET['page'])){ $page = $_GET['page']; }else{ $page = "home"; } switch ($page) { case 'home': require ("home.php"); break; ~同じようなのが複数~略 default: echo "ページが見つかりませんでした"; break; }

    • ベストアンサー
    • PHP
  • pg_escape_stringとhtmlspecialcharsの記述の仕方について

    お世話になります。フォームで入力した値をpostでPHPに送ってます。 その際にセキュリティを考えてpg_escape_stringとhtmlspecialchars関数を使用したいのですが、簡単な記述方法が分かりません。 今現在は下記のようにしてます。 $tesuto=pg_escape_string(@$_POST["tesuto"]); $tesuto="'" .htmlspecialchars($tesuto) ."'"; フォームで入力する項目が20箇所あるので、これをスマートに 記述する方法は無いでしょうか?よろしくお願いします。

    • ベストアンサー
    • PHP
  • htmlspecialcharsの正しいタイミング

    htmlspecialcharsを使うタイミングがいまいちわかりません。 調べてみると、html出力時だということがわかりました。 mysqlを使った場合は以下の手順、 、 (1)フォームの内容をmysql_real_escape_stringしてデータベースに保存 (2)データベースから取り出すとき、htmlspecialcharsして出力する。 だとわかりましたが、ここで疑問点があります。 これまで掲示板などをデータベースを使わずファイル保存で作る場合、 (1)フォームの内容をhtmlspecialcharsしてファイルに保存 (2)foreachですべて表示 というやり方をしていましたが、正しくは、 (1)htmlspecialcharsせず、そのままファイルに保存 (2)foreachで表示するとき、htmlspecialcharsする という順序なのでしょうか?? わかりにくくて申し訳ないのですが、ご教授ください。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • $GETが取得できない場合に指定の値を使う

    PHPでURLから変数を取得できるGETというのがありますがURLにこの値が指定されていない場合に指定した値を使うことは可能でしょうか? つまりこういうことです。 $aaa = $_GET['bbb']; としている場合にURLを ~/index.php?bbb=0000 とした場合は aaa=0000 となりますが、 ~/index.php としかしなかった場合はaaaの値は取得できずにエラーになってしまうため、このaaaの値を強制的に1111に指定し aaa=1111 としてphpプログラムを続行させたいのです。 そのようなことはできますか?

    • ベストアンサー
    • PHP
  • PHPの入力フォームの確認画面の構文エラー

    <?php session_start(); require_once "define.php"; echo "<b>質問内容</b><br>"; echo "タイトル : ".htmlspecialchars($_SESSION[TITLE], ENT_QUOTES)."<br>"; echo "URL : ".htmlspecialchars($_SESSION[URL], ENT_QUOTES)."<br>"; echo "メール : ".htmlspecialchars($_SESSION[MAIL], ENT_QUOTES)."<br>"; echo "<br>質問ありがとうございました。<br><br>"; echo "<a href=\"./index.php\">入力フォームに戻る</a>"; ?> こういう感じのPHPの構文を書いたんですがなぜか echoで表示してあるタイトル、URL、メールのところが ちゃんと表示されません define.phpは間違いなくちゃんとファイルとして書いてあります どこか間違っているところがあるのでしょうか? 原因がわかりません、一日中悩んだけど 答えがわかりません、どなたかよろしくお願いします。

    • 締切済み
    • PHP
  • $_POST,$_GETの値が空...

    はじめまして。まだまだPHP初心者なのですが.. PHP Ver 4.3.2 にて、$_POST 、 $_GET の値がどうしても 受け取れないのですが、何か設定がおかし いのでしょうか... ちなみに、register_global は OFF です。 GET は URL http://***.com/xxx.php?ID=aaa echo $_GET["ID"]; print_r ( $_GET ); POSTは、通常通り form の method を POSTに設定して 受け取っていますが、どちらにしても結果は、何も表示されません。 どなたか解決方法をご教授下さい。 また、既出でしたら申し訳ございませんがご指摘下さい。

    • ベストアンサー
    • PHP

専門家に質問してみよう