• 締切済み

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; ?>

みんなの回答

  • t_ohta
  • ベストアンサー率38% (5238/13706)
回答No.5

> Chrome, FireFox では、デコードされた内容が表示されてました。 > でも、これでは、セキュリティの面から、氏名や、カード番号などの > データをGET渡ししたいときには、危険じゃないのでしょうか? そもそもGET渡しは通信中も丸見えなので危険です。 SSL化してPOSTで渡すか、自ら暗号化して解読されないようにするしかありません。

beterugius
質問者

お礼

ご指導、ありがとうございました。

回答No.4

たとえば https://ja.wikipedia.org/wiki/%E6%A4%9C%E7%B4%A2 っていうurlencodeされたURL文字をブラウザのURL欄に入れると ブラウザ側の機能により %2桁...の部分は、"検索”で表示されます。 なので urlencode()しても隠蔽したことにはなりません。 GETデータをブラウザのURL欄に見せたくないなら、 既にご回答のあるとおり暗号化なりハッシュ化なりしないとですね。 もしくは、リンクでなくFormにしてmethodをPOSTにするか。

beterugius
質問者

お礼

詳しいご回答、どうもありがとうございました。

beterugius
質問者

補足

そうでしたか。自分もGETよりもPOSTのほうがセキュリティ上断然安全だとは思っていたところです。再確認させていただき、ありがとうございました。

  • t_ohta
  • ベストアンサー率38% (5238/13706)
回答No.3

> 空条や1が生のデータとして、ブラウザのURL欄に表示されております。 ブラウザの種類によってはURL欄はデコードした内容を表示する場合がありますよ。

beterugius
質問者

お礼

何度もご回答有難うございました。

beterugius
質問者

補足

ちなみに、IEのみ、ブラウザのURL蘭でエンコードされてました。 Chrome, FireFox では、デコードされた内容が表示されてました。 でも、これでは、セキュリティの面から、氏名や、カード番号などの データをGET渡ししたいときには、危険じゃないのでしょうか?

  • t_ohta
  • ベストアンサー率38% (5238/13706)
回答No.2

> では、たとえば、?name=山田&from=1 というクエリー文字列を > 渡して、ジャンプした場合、ブラウザのURL欄には、山田、や 1などが > そのまま、表示されてしまうということですよね?氏名などの漢字や、パスワード文字列などの、セキュリティに触れる文字列は、生のデータがブラウザのURL欄に表示されてしまうということですか? そういう事です。 見えなくしたいのであれば、単純な処理なら urlencode() を使うとか base64_encode() を使ったり、Mcrypt 関数群を使って暗号化するなどしましょう。

beterugius
質問者

お礼

ご回答、どうもありがとうございました。

beterugius
質問者

補足

一応、最初の質問の中に、ジャンプ元で、urlencode()とジャンプ先でurldecode()してはいるのですが、これではだめなのでしょうか。 確かに、t_ohta様のおっしゃるように、htmlspecailchars()で、ダブルクオーテーションや、シングルクオーテーションはHTMLエンコードされましたが、urlencode()を使ってるにも関わらず、空条や1が生のデータとして、ブラウザのURL欄に表示されております。

  • t_ohta
  • ベストアンサー率38% (5238/13706)
回答No.1

htmlspecialchars() は全ての文字を変換する訳ではありません。 変換対象は ・& (アンパサンド) ・" (ダブルクォート) ENT_NOQUOTES の設定次第 ・' (シングルクオート) ENT_QUOTES の設定次第 ・< (小なり) ・> (大なり) です。

beterugius
質問者

お礼

ご回答、どうもありがとうございました。

beterugius
質問者

補足

では、たとえば、?name=山田&from=1 というクエリー文字列を 渡して、ジャンプした場合、ブラウザのURL欄には、山田、や 1などが そのまま、表示されてしまうということですよね?氏名などの漢字や、パスワード文字列などの、セキュリティに触れる文字列は、生のデータがブラウザのURL欄に表示されてしまうということですか?

関連するQ&A

専門家に質問してみよう