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.
-------
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");
-------
をやっても、エスケープされて出力されて出てきません。
コメント(7件)
-------------------------------------------------
もし、その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()」で出力すると確認できると思います。
上記と同じで、「print_r()」または「var_dump()」を使ってみてください。(※文字列なら「echo」でも大丈夫です。)
例えば、「$_GET」あるいは「$_POST」で受け取った内容を何らかの変数に入れてから処理していると思います。
エスケープ処理の直後に出力して確認してみてください。
$message = $_GET['message']; // 変数に代入
// ... エスケープ以外の確認の処理等
$message = htmlspecialchars($message); // エスケープ処理
//エスケープ処理後に出力して確認
$var_dump($message);
ブラウザの表示では、解釈されて見た目は変化がないように見えます。
HTMLソースを表示して確認してみてください。
htmlspecialchars
--------------------------------------------------------
変換対象となる文字は以下の通りです。
・'&' (アンパサンド) は '&' になります。
・ENT_NOQUOTES が設定されていない場合、 '"' (ダブルクォート) は '"'になります。
・ENT_QUOTES が設定されている場合のみ、 "'" (シングルクオート) は ''' (あるいは ') になります。
・'<' (小なり) は '<' になります。
・'>' (大なり) は '>' になります。
--------------------------------------------------------
※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");
--------------------------------------------------------
少し早目に締め切るようにしています。
わからない時は、再度勉強->質問のし直し、をするようにしています。
教えていただいた内容、やってみます。
1例目は次のようにあるように、「htmlspecialchars()」に渡した文字列がブラウザ上ではそのまま表示されます。
HTMLエンティティに変換しなければ、「Test」という文字列がリンクになって表示されるので、「<a href='test'>Test</a>」という文字列が見えている事でも変化があった(※HTMLとしての動作になっていない)事が分かると思います。
-----------------------------------------------
echo $new; // <a href='test'>Test</a>
-----------------------------------------------
※HTMLソースで見ると「<a href='test'>Test</a>」になっていると思います。
※駆け込み対策については分かりました。
少し前の仕様変更で、締め切りまでの期日が最長1ヶ月まで指定可能になったようです。
>締め切りまでの期日が最長1ヶ月まで指定可能
やってみます。(投稿時でないと無理かもしれませんね。)
いただいたアドバイスは、考えながらやってみます。
取り急ぎ御礼まで。
>HTMLエンティティに変換しなければ、「Test」という文字列がリンクになって表示される
2.
>HTMLソースで見ると「<a href='test'>Test</a>」になっている
以上2点、すばらしいアドバイスでした。
理解できました。
ありがとうございました。