- 締切済み
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; ?>
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- t_ohta
- ベストアンサー率38% (5238/13706)
> Chrome, FireFox では、デコードされた内容が表示されてました。 > でも、これでは、セキュリティの面から、氏名や、カード番号などの > データをGET渡ししたいときには、危険じゃないのでしょうか? そもそもGET渡しは通信中も丸見えなので危険です。 SSL化してPOSTで渡すか、自ら暗号化して解読されないようにするしかありません。
- superside0
- ベストアンサー率64% (461/711)
たとえば https://ja.wikipedia.org/wiki/%E6%A4%9C%E7%B4%A2 っていうurlencodeされたURL文字をブラウザのURL欄に入れると ブラウザ側の機能により %2桁...の部分は、"検索”で表示されます。 なので urlencode()しても隠蔽したことにはなりません。 GETデータをブラウザのURL欄に見せたくないなら、 既にご回答のあるとおり暗号化なりハッシュ化なりしないとですね。 もしくは、リンクでなくFormにしてmethodをPOSTにするか。
お礼
詳しいご回答、どうもありがとうございました。
補足
そうでしたか。自分もGETよりもPOSTのほうがセキュリティ上断然安全だとは思っていたところです。再確認させていただき、ありがとうございました。
- t_ohta
- ベストアンサー率38% (5238/13706)
> 空条や1が生のデータとして、ブラウザのURL欄に表示されております。 ブラウザの種類によってはURL欄はデコードした内容を表示する場合がありますよ。
お礼
何度もご回答有難うございました。
補足
ちなみに、IEのみ、ブラウザのURL蘭でエンコードされてました。 Chrome, FireFox では、デコードされた内容が表示されてました。 でも、これでは、セキュリティの面から、氏名や、カード番号などの データをGET渡ししたいときには、危険じゃないのでしょうか?
- t_ohta
- ベストアンサー率38% (5238/13706)
> では、たとえば、?name=山田&from=1 というクエリー文字列を > 渡して、ジャンプした場合、ブラウザのURL欄には、山田、や 1などが > そのまま、表示されてしまうということですよね?氏名などの漢字や、パスワード文字列などの、セキュリティに触れる文字列は、生のデータがブラウザのURL欄に表示されてしまうということですか? そういう事です。 見えなくしたいのであれば、単純な処理なら urlencode() を使うとか base64_encode() を使ったり、Mcrypt 関数群を使って暗号化するなどしましょう。
お礼
ご回答、どうもありがとうございました。
補足
一応、最初の質問の中に、ジャンプ元で、urlencode()とジャンプ先でurldecode()してはいるのですが、これではだめなのでしょうか。 確かに、t_ohta様のおっしゃるように、htmlspecailchars()で、ダブルクオーテーションや、シングルクオーテーションはHTMLエンコードされましたが、urlencode()を使ってるにも関わらず、空条や1が生のデータとして、ブラウザのURL欄に表示されております。
- t_ohta
- ベストアンサー率38% (5238/13706)
htmlspecialchars() は全ての文字を変換する訳ではありません。 変換対象は ・& (アンパサンド) ・" (ダブルクォート) ENT_NOQUOTES の設定次第 ・' (シングルクオート) ENT_QUOTES の設定次第 ・< (小なり) ・> (大なり) です。
お礼
ご回答、どうもありがとうございました。
補足
では、たとえば、?name=山田&from=1 というクエリー文字列を 渡して、ジャンプした場合、ブラウザのURL欄には、山田、や 1などが そのまま、表示されてしまうということですよね?氏名などの漢字や、パスワード文字列などの、セキュリティに触れる文字列は、生のデータがブラウザのURL欄に表示されてしまうということですか?
お礼
ご指導、ありがとうございました。