• 締切済み

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
  • 回答数5
  • ありがとう数7

みんなの回答

  • t_ohta
  • ベストアンサー率38% (5080/13276)
回答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% (5080/13276)
回答No.3

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

beterugius
質問者

お礼

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

beterugius
質問者

補足

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

  • t_ohta
  • ベストアンサー率38% (5080/13276)
回答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% (5080/13276)
回答No.1

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

beterugius
質問者

お礼

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

beterugius
質問者

補足

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

関連するQ&A

  • $_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''>を、 それぞれ出力しました。 ------------------------------ どなたか、分かりましたら教えて下さい。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • エンコードについて

    URLエンコードを使用してデーターの受け渡しをしようと思っているんですが。 1ページ目 $cc4=urlencode("ソ"); echo "エンコード={$cc4}<BR>"; 2ページ目 $cc5=urldecode($cc4); echo "デコード={$cc5}"; カタカナの『ソ』が入るとちゃんと受け渡しが出来ません。 どうしたらいいでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • ヒアドキュメントと、htmlspecialcharsの違いを教えて下さい。

    PHPのセキュリティを強化しようと勉強しているのですが わからないことがあります。 セキュリティの本には、変数の出力の場合は、 htmlspecialcharsで書くべきと載っていますが、 これまでヒアドキュメントで書いていた部分も、 htmlspecialcharsに直す必要があるのでしょうか? ■ヒアドキュメント echo<<<EOD $hogehoge EOD; ■htmlspecialchars echo htmlspecialchars($hogehoge,ENT_QUOTES,'UTF-8'); この二つの違いと、 どちらがセキュリティとして良いかのかを教えて下さい。

    • ベストアンサー
    • PHP
  • php pdo データベース

    前に書き込んだのが状況がわかったので再度書きます update.phpでGETで取った番号のデータを表示します 番号は主キーなので変更できないように表示のみにします update.phpのフォームをuptate2.phpに送ります <?php $ID = htmlspecialchars($_GET['番号']); $pdo = new PDO("mysql:dbname=db_test;host=localhost", "root", "admin"); $st = $pdo->prepare("SELECT * FROM tbl_test WHERE 番号=?"); $st->execute(array($ID)); $row = $st->fetch(); $NAME = htmlspecialchars($row['氏名']); $ADDR = htmlspecialchars($row['住所']); ?> <form action="update2.php" method="post"> 番号<br> <?php echo $ID ?><br> <input type="hidden" name="ID" value="<?php echo $ID; ?>"> 氏名<br> <input type="text" SIZE = "50" NAME="NAME" value="<?php echo $NAME ?>"><br> 住所<br> <input type="text" SIZE = "130"NAME="ADDR" value="<?php echo $ADDR ?>"><br> <input type="submit"> </form> アップデ-トphp update2.php <?php $pdo = new PDO("mysql:dbname=db_test;host=localhost", "root", "admin"); $st = $pdo->prepare("UPDATE tbl_test SET 氏名=?,住所=?WHERE 番号=?"); $st->execute(array($_POST['ID'],$_POST['NAME'], $_POST['ADDR'])); ?> レコードを修正しました。 今の現状 エラーが出ないでレコードを修正しました。と表示されるがレコードが修正されていない どこがいけないと思いますか?

    • ベストアンサー
    • PHP
  • php データベース更新

    番号 int プライマリーキー 氏名  varchar 住所 varchar 一覧画面に修正というボタンをつくりボタンクリックすると入っているデータがテキストボックスで表示され入力できるようにした。 番号は主キーなので表示のみにして編集できないようにした ソース GETで番号をとりupdate2.phpにわたす update.php <?php $ID = htmlspecialchars($_GET['番号']); $pdo = new PDO("mysql:dbname=db_test;host=localhost", "root", "admin"); $st = $pdo->prepare("SELECT * FROM tbl_test WHERE 番号=?"); $st->execute(array($ID)); $row = $st->fetch(); $ID = htmlspecialchars($row['番号']); $NAME = htmlspecialchars($row['氏名']); $ADDR = htmlspecialchars($row['住所']); ?> <form action="update2.php" method="post"> 番号<br> <?php echo $ID ?><br> 氏名<br> <input type="text" SIZE = "50" NAME="NAME" value="<?php echo $NAME ?>"><br> 住所<br> <input type="text" SIZE = "130"NAME="ADDR" value="<?php echo $ADDR ?>"><br> <input type="submit"> </form> アップデートphpは下記のとおり update2.php <?php $pdo = new PDO("mysql:dbname=db_test;host=localhost", "root", "admin"); $st = $pdo->prepare("UPDATE tbl_test SET 氏名=?,住所=?WHERE 番号=?"); $st->execute(array($_POST['ID'],$_POST['NAME'], $_POST['ADDR'])); ?> レコードを修正しました。 だかupdate2.phpでエラ-がおきて先に進めません

    • ベストアンサー
    • PHP
  • チェックボックスの内容が送信出来ません。

    PHPのメールフォームにチェックボックスを追加しましたがうまく送れず頭を抱えています。 お力をお貸しください。 必要だと思われるソースです。 inquiry.html <form action="check_inquiry.php" method="POST"> <p><label for="title">お名前:</label> <input type="text" name="title" size="60"> </p> <p><INPUT type="checkbox" name="check[]" value="資料請求" />資料請求<INPUT type="checkbox" name="check[]" value="至急" />至急<INPUT type="checkbox" name="check[]" value="質問" />質問</p> <br /> <p><label for="massage">メッセージ:</label></p> <p><textarea name="message" cols="50" rows="20"></textarea></p> <p><input type="submit" value="内容の確認"></p> </form> check_inquiry.php <?php $title = htmlspecialchars($_POST['title'], ENT_QUOTES); $message = htmlspecialchars($_POST['message'], ENT_QUOTES); $m_check = $_POST['check']; ?> ■内容を確認してください。 <br> <form action="send_inquiry.php" method="POST"> <input type="hidden" name="title" value="<?php echo $title; ?>" /> <input type="hidden" name="message" value="<?php echo $message; ?>" /> <input type="hidden" name="check" value="<?php for($i=0; $i<sizeof($m_check); $i++){ echo "【${m_check[$i]}】"; } ?>" /> <br /> お名前: <br /> <?php echo $title; ?> <br /> 問い合わせ内容: <?php for($i=0; $i<sizeof($m_check); $i++){echo "【${m_check[$i]}】"; }; ?> <br /> メッセージ詳細: <br /> <?php // 改行部分にBRタグを埋め込む echo nl2br($message); ?> <br /> <input type="submit" value="お問い合わせ内容の送信"> </form> send_inquiry.php <?php $title = htmlspecialchars($_POST['title'], ENT_QUOTES); $message = htmlspecialchars($_POST['message'],ENT_QUOTES); $m_check = $_POST['check']; //日本語UTF8 mb_language('ja'); mb_internal_encoding('UTF8'); //自動送信<送信元のアドレス $name = '自動送信'; $email = 'メールアドレス'; $header = 'From: '. mb_encode_mimeheader($name) . '<' . $email .'>'; // メール送信 $result = mb_send_mail($email, $title, $message, $header, $m_check); //メール送信の確認 if ($result) { // メール送信の成功 echo '■管理人へ送信しました。'; } else { // メール送信の失敗 echo '■管理人への送信に失敗しました。'; } ?> チェックボックスにチェックを入れないと送信出来ますが チェックを入れると送信に失敗します。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • nl2bの代用関数を何か知っていますか?

    下記のような内容で、input.html:「name="example"」に入力された内容をoutput.html: 「$example」に出力していますが、output.html:の表示が乱れます。nl2brの代用関数を何かご存知の方は、いませんか?複数あれば、複数教えて下さい。 また、下記コードでおかしな部分があれば、指摘してください。 input.html: <textarea name="example"></textarea> output.html: <?php echo nl2br(htmlspecialchars($example, ENT_QUOTES, 'UTF-8')) ?> 参考サイト等も教えて下さい。 よろしくお願いします。

    • 締切済み
    • PHP
  • PHP ソートについて

    以前も、似たような質問をしたのですが少し内容が違いますのでよろしくお願いいたします。 このページ内で、ゲットしたキーワードを再ソートすると、2回エンコードされてしまいます。続けてまた、ソートすると、エンコードされた値がまたエンコードされてしまいます。、始めにゲットした値を1回だけエンコードし、ソートを変えても1回目のエンコードされた値を使うにはどのようにしたらよいのでしょうか? $base = 'http://xxx.xxxxxx.co.jp/xxx/xxx'; $keyword =$_GET["keyword"]; $keyword = urlencode($keyword); $sort = $_GET["sort"]; $sort = urlencode($sort); $url = $base ."&keyword=".$keyword."&sort=".$sort. ; <form action="<?=$_SERVER["SCRIPT_NAME"] ?>" method="get"> <input type="hidden" name="keyword" value="<?php print(htmlspecialchars($keyword, ENT_QUOTES)); ?>"> 表示順序 <select name="sort"> <option value="satandard">新着順</option> <option value="Price">安い順</option> <option value="-Price">高い順</option> <input type="submit" value="検索"> </select> </form>

    • ベストアンサー
    • PHP
  • javascript php フォームについて

    javascriptで作ったフォームをphpに送信したいのですが、上手く送信できません。 どのようにすれば上手く送信することができるでしょうか? 回答お願いします。 javascript側のソース <body> <form name="nform1" method="POST" action="./kaitou1.php" enctype="text/plain"> <p>問1</p> <p> (1)<input type="text" name="kaitouran11" size="20"> (2)<input type="text" name="kaitouran12" size="20"> (3)<input type="text" name="kaitouran13" size="20"> (4)<input type="text" name="kaitouran14" size="20"> </p> </form> <form name="nform2" method="POST" action="./kaitou1.php" enctype="text/plain"> <p>問2</p> <p> (1)<input type="text" name="kaitouran21" size="20"> (2)<input type="text" name="kaitouran22" size="20"> (3)<input type="text" name="kaitouran23" size="20"> (4)<input type="text" name="kaitouran24" size="20"> </p> </form> <form name="nform3" method="POST" action="./kaitou1.php" enctype="text/plain"> <p>問3</p> <p> (1)<input type="text" name="kaitouran31" size="20"> (2)<input type="text" name="kaitouran32" size="20"> (3)<input type="text" name="kaitouran33" size="20"> (4)<input type="text" name="kaitouran34" size="20"> </p> </form> <input type="button" value="送信" onClick="send()"> </body> php側のソース <body> <p>問1</p> <p>(1)<?php print(htmlspecialchars($_POST['kaitouran11'], ENT_QUOTES, 'UTF-8')); ?> (2)<?php print(htmlspecialchars($_POST['kaitouran12'], ENT_QUOTES, 'UTF-8')); ?> (3)<?php print(htmlspecialchars($_POST['kaitouran13'], ENT_QUOTES, 'UTF-8')); ?> (4)<?php print(htmlspecialchars($_POST['kaitouran14'], ENT_QUOTES, 'UTF-8')); ?> </p> <p>問2</p> <p>(1)<?php print(htmlspecialchars($_POST['kaitouran21'], ENT_QUOTES, 'UTF-8')); ?> (2)<?php print(htmlspecialchars($_POST['kaitouran22'], ENT_QUOTES, 'UTF-8')); ?> (3)<?php print(htmlspecialchars($_POST['kaitouran23'], ENT_QUOTES, 'UTF-8')); ?> (4)<?php print(htmlspecialchars($_POST['kaitouran24'], ENT_QUOTES, 'UTF-8')); ?> </p> <p>問3</p> <p>(1)<?php print(htmlspecialchars($_POST['kaitouran31'], ENT_QUOTES, 'UTF-8')); ?> (2)<?php print(htmlspecialchars($_POST['kaitouran32'], ENT_QUOTES, 'UTF-8')); ?> (3)<?php print(htmlspecialchars($_POST['kaitouran33'], ENT_QUOTES, 'UTF-8')); ?> (4)<?php print(htmlspecialchars($_POST['kaitouran34'], ENT_QUOTES, 'UTF-8')); ?> </p> </body>

    • 締切済み
    • PHP
  • phpでMysqlに接続し掲示板を作りたいのですが

    質問させて頂きます。 ご存じの方がおられましたらご享受くださいませ。 phpをつかって MySQLに接続し掲示板を作ろうとしていますが 参考書に書いてある通りに書きましたが動きません。 どこか記載がおかしいのでしょうか… SQL初心者で完全にハマっております。 ご存じの方がおられましたら是非教えてくださいませ。 宜しくお願いいします!! ※接続はできています。 多分インサートあたりが反応していません。 プレペアドステートメントが変なのかな? <?php include("../header.php");?> <?php $savepath = dirname(_FILE_).'/chatlog.db'; $script_name = $_SERVER["SCRIPT_NAME"]; $dsn = 'mysql:dbname=DB名;host=ホスト'; $user = 'ユーザ名'; $password = 'パスワード'; try { $dbh = new PDO($dsn, $user, $password); echo 'MySQL DataBase と接続しました。'; $dbh->query('SET NAMES utf8'); } catch (PDOException $e) { echo 'データベースに接続できません。'.$e->getMessage(); } $create_query = <<< _SQL_ CREATE TABLE IF NOT EXISTS chatlog ( log_id INTEGER PRIMARY KEY, name TEXT, body TEXT, ctime INTEGER ); _SQL_; $db->exec($create_query); if (isset($_GET["name"]) && isset($_GET["body"])) { if ($_GET["name"] == "" || $_GET["body"] == "" ) { echo "<p>名前と本文は必ず入力してください。</p>";exit; } $template = "INSERT INTO chatlog (name,body,ctime)". "VALUES(?,?,?);"; $stmt = $db->prepare($template); $stmt->execute(array($_GET["name"],$_GET["body"],time())); header("location: $script_name"); exit; } echo <<< _FORM_ <h3>チャット</h3> <form action="$script_name" method="GET"> 名前:<input type="text" name="name" size="8" /> 本文:<input type="text" name="body" size="40" /> <input type="submit" value="書込" /> </form> _FORM_; $select_query = "SELECT * FORM chatlog ORDER BY log_id DESC"; $stmt = $db->query($select_query); foreach ($stmt as $row) { $name = htmlspecialchars($row["name"]); $body = htmlspecialchars($row["body"]); $ctime = date("H:i:s", $row["ctime"]); echo "($ctime) $name &gt; $body"; } ?> <?php include("../footer.php");?>

    • ベストアンサー
    • PHP

専門家に質問してみよう