エスケープの確認について


PHP(5.5) Apache(2.4)、MySQL(5.6)をローカルにインストールして、
セキュリティの勉強しています。
PDO、prepareステートメント、
htmlspecialchars 関数、等はプログラムに組み込めますが、
確認の方法がわかりません。

http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13108302648
の「補足」の下に、
「一応自動的にエスケープされてるみたいです。」
なる文言があります。

例えば、$_GETを使ったサイトで、
GETしたサイトのURLは、コピペすると
http://localhost/giin/kensaku.php?skaiha=001&sdaigaku=001
となります。
コピーしたURLをメモ帳にペーストすると、
エンコードされたURLで表示されるのが、エスケープされている、
と勝手に思い込んでいましたが、

エスケープされた、事の確認方法を教えていただけると助かります。

回答の条件
  • 1人1回まで
  • 登録:
  • 終了:2014/12/07 11:15:05
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。
id:kohhi

質問者から

kohhi2014/12/09 11:29:19

いつもお返事をいただき、ありがとうございます。

------------------------------

1.

-------

http://php.net/manual/ja/function.htmlspecialchars.php

の通りに単純に下記2行

$new = htmlspecialchars("Test", ENT_QUOTES);

echo $new; // <a href='test'>Test</a>


2.

----

http://php.net/manual/ja/function.htmlentities.php

の通りに単純に下記2行

$str = "\x8F!!!";

// 出力: 空の文字列

echo htmlentities($str, ENT_QUOTES, "UTF-8");

// 出力: "!!!"

echo htmlentities($str, ENT_QUOTES | ENT_IGNORE, "UTF-8");

-------

をやっても、エスケープされて出力されて出てきません。

回答0件)

回答はまだありません

  • id:rouge_2008
    知恵袋の回答にある通りではないでしょうか?(以下、関連する箇所を一部抜粋)
    -------------------------------------------------
    もし、そのSQL文で本当にエスケープされていたのなら、それはおそらく magic_quotes_gpc によるものです。
    http://www.php.net/manual/ja/info.configuration.php#ini.magic-quote...
    var_dump(get_magic_quotes_gpc()); として true が出力されたら、magic_quotes_gpc が ON になっています。

    PHP5.3で非推奨,5.4で削除された 無駄な混乱を招いたPHPの黒歴史的な機能ですので、OFF にする事を強く推奨します。
    -------------------------------------------------

    PHP5.5という事ですので、現在の環境では確認できないと思います。
    PHP5.3以前の環境がでしたら、「magic_quotes_gpc」をONに設定して、「$_GET」「$_POST」等を「print_r()」または「var_dump()」で出力すると確認できると思います。
  • id:rouge_2008
    「自動的にエスケープされた事の確認」ではなくて、「htmlspecialchars()」等で処理した場合を含む、「エスケープされた事の確認」ですね?
    上記と同じで、「print_r()」または「var_dump()」を使ってみてください。(※文字列なら「echo」でも大丈夫です。)

    例えば、「$_GET」あるいは「$_POST」で受け取った内容を何らかの変数に入れてから処理していると思います。
    エスケープ処理の直後に出力して確認してみてください。

    $message = $_GET['message']; // 変数に代入
    // ... エスケープ以外の確認の処理等
    $message = htmlspecialchars($message); // エスケープ処理

    //エスケープ処理後に出力して確認
    $var_dump($message);


  • id:rouge_2008
    質問が締め切りになっていますが、既に解決したのでしょうか?

    ブラウザの表示では、解釈されて見た目は変化がないように見えます。
    HTMLソースを表示して確認してみてください。

    htmlspecialchars
    --------------------------------------------------------
    変換対象となる文字は以下の通りです。
    ・'&' (アンパサンド) は '&amp;' になります。
    ・ENT_NOQUOTES が設定されていない場合、 '"' (ダブルクォート) は '&quot;'になります。
    ・ENT_QUOTES が設定されている場合のみ、 "'" (シングルクオート) は '&#039;' (あるいは &apos;) になります。
    ・'<' (小なり) は '&lt;' になります。
    ・'>' (大なり) は '&gt;' になります。
    --------------------------------------------------------


    ※2例目は、以下の通り無効な文字列が含まれていた為空文字または一部切り捨てられて表示されたのだと思います。

    htmlentities
    --------------------------------------------------------
    パラメータ
    flags
    ENT_IGNORE 無効な符号単位シーケンスを含む文字列を渡したときに、 空の文字列を返すのではなく無効な部分を切り捨てるようになります。 このフラグは使わないようにしましょう。 » セキュリティの問題が発生する可能性があります。

    ...

    返り値

    エンコードした文字列を返します。

    入力文字列の中に、指定した encoding で無効な符号単位シーケンスが含まれる場合は、 ENT_IGNORE あるいは ENT_SUBSTITUTE フラグが設定されていない限りは空文字列を返します。
    --------------------------------------------------------


    ※サンプルコードと共に出力例も記載されています。(以下の出力結果と同じ表示でしたら、正常に動作しています。)
    --------------------------------------------------------
    $str = "\x8F!!!";

    // 出力: 空の文字列
    echo htmlentities($str, ENT_QUOTES, "UTF-8");

    // 出力: "!!!"
    echo htmlentities($str, ENT_QUOTES | ENT_IGNORE, "UTF-8");

    --------------------------------------------------------
  • id:kohhi
    すいません。締切間近で、回答がないと、「駆け込み」で回答する人がいて、
    少し早目に締め切るようにしています。
    わからない時は、再度勉強->質問のし直し、をするようにしています。

    教えていただいた内容、やってみます。
  • id:rouge_2008
    きちんと伝わったかどうか分からないので少し補足します。

    1例目は次のようにあるように、「htmlspecialchars()」に渡した文字列がブラウザ上ではそのまま表示されます。
    HTMLエンティティに変換しなければ、「Test」という文字列がリンクになって表示されるので、「<a href='test'>Test</a>」という文字列が見えている事でも変化があった(※HTMLとしての動作になっていない)事が分かると思います。

    -----------------------------------------------
    echo $new; // <a href='test'>Test</a>
    -----------------------------------------------

    ※HTMLソースで見ると「&lt;a href=&#039;test&#039;&gt;Test&lt;/a&gt;」になっていると思います。

    ※駆け込み対策については分かりました。
    少し前の仕様変更で、締め切りまでの期日が最長1ヶ月まで指定可能になったようです。
  • id:kohhi
    rouge_2008 さん、ご丁寧にありがとうございます。
    >締め切りまでの期日が最長1ヶ月まで指定可能
    やってみます。(投稿時でないと無理かもしれませんね。)
    いただいたアドバイスは、考えながらやってみます。
    取り急ぎ御礼まで。
  • id:kohhi
    1.
    >HTMLエンティティに変換しなければ、「Test」という文字列がリンクになって表示される

    2.
    >HTMLソースで見ると「&lt;a href=&#039;test&#039;&gt;Test&lt;/a&gt;」になっている
    以上2点、すばらしいアドバイスでした。
    理解できました。
    ありがとうございました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません