• ベストアンサー

htmlspecialcharsの使い時

phpでhtmlspecialcharsを使ってタグの無効化をするとセキュリティーが向上するとあったのですが、フォームからのデータを読み込んで保存する時に使うのが良いのでしょうか? それとも保存時は何もせずに表示する時にこの関数を通すのが良いのでしょうか? 自分は保存時にこの関数を通すと思っていたのですが、翔泳社のPHP入門教室10日で覚えるシリーズのサンプルではDBからデータを読み込んで表示する時にこの関数を通していました。 こちらのほうが正解なのでしょうか。 よろしくお答えください。

  • PHP
  • 回答数3
  • ありがとう数3

質問者が選んだベストアンサー

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

表示する時に使う方がいいのではないでしょうか。 htmlspecialcharsの本来の目的は”<”、”>”などの特殊文字をHTMLエンティティに変換して、ブラウザにタグでは無く文字としてその記号を表示させる事です。 データとしては記号そのものがDBに入っているのが正しい状態で、その記号をブラウザがHTML記述上の特殊文字として扱わないようにHTMLエンティティに変換してブラウザに渡すという処理にすると考えたらいいと思います。

_rakuda_
質問者

お礼

データとしては返還前の入力値そのものが入っているのが正しい状態なのですね。 ありがとうございます。

その他の回答 (2)

noname#244856
noname#244856
回答No.3

出力するタイミングで使うのが正解。 http://note.chiebukuro.yahoo.co.jp/detail/n149597

_rakuda_
質問者

お礼

リンク先見ました。 出力する際にはとありましたので保存のタイミングではないのですね。 ありがとうございました。

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.1

エスケープは「必要なときに必要なエスケープを行う」のが基本です。 ∴ htmlspecialcharsは『表示するときに』使うべきです。

_rakuda_
質問者

お礼

ありがとうございます。 必要なときは表示の時ですね。

関連するQ&A

  • htmlspecialcharsとその逆

    こんにちは。PHP(&mySQL)初心者です。 基本的な事かもしれませんが、自分で調べてもよくわからないので、どなたかご教示いただけないでしょうか。 下記のような2つのファンクションが定義されているとします。 <?php function h($value) { return htmlspecialchars($value, ENT_QUOTES, 'UTF-8'); } ?> <?php function dec($hd_value) { return htmlspecialchars_decode($hd_value); } ?> フォームから受け取った文字列を「h()」で処理した上で、DB(mySQL)に格納し、ブラウザで表示するときは、DBから受け取った文字列を「dec()」で元に戻しています。 通常は、これで問題ないのですが、文字列に「<br/>」のようなHTMLタグと「<jpSampleTag=lnum1>」のような独自のタグ(のようなもの)が混在してた場合、ブラウザでの表示時に「<jpSampleTag=lnum1>」が無視されて表示されません。 一応、「dec(h($value))」のように、入れ子にすると「<jpSampleTag=lnum1>」の部分も表示されることがわかったのですが、今度はhtmlのタグのヤマ括弧まで「&lt;」のようなhtmlエンティティに変換されてしまい、改行などができずに困っています。 htmlタグだけを復元する方法はないものでしょうか? あるいは、DBに文字列を格納する段階で、なにか別の処理をした方がいいのでしょうか。 どなたか良い方法をご存知の方がいらっしゃいましたら、ご教示いただけないでしょうか。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • htmlspecialcharsについて

    フォームから送られてきたデータの中に「<」や「>」が含まれていたら htmlspecialcharsを使用してを変換したいのですが、変換されず その原因もわからない状態でおります。 $text=$_POST['text']; $text= htmlspecialchars($text); print"text=$text"; としています。 フォームから「"」を入力すると「\"」と変換されます。 PHPマニュアルなど見ますと「<」は「&lt;」に変換され表示される のでは思っているのですが。 また、preg_replace も試しましたが変換されませんでした。 PHP Version 4.3.10です。 どなたかご教授いただけないでしょうか。お願いします。

    • ベストアンサー
    • PHP
  • htmlspecialcharsの文字化け(?)

    お世話になります。 現在PHP勉強中で、フォームの内容をCSVに保存し、情報をメールで送信する、 というものをつくっているのですが、 フォーム上でタグを利用できないようにhtmlspecialcharsを使用することにしました。 とりあえずタグが使えないように置き換えは出来たのですが、 なぜか「"」の前に「\」がついてしまい、困ってます。 以前、エンコード設定がSJISだった時に「予約」「表示」等の文字が 「予\約」「表\示」になったことがあり、今回もその類かと思ったのですが、 今回は全てEUCにしているので、それはないと思います。 フォームに「<"">」と入力し、その部分を <? echo htmlentities($m_name,ENT_NOQUOTES); ?> と記述したところの表示結果が <\"\"> というようになっています。 どうしたらこの「\」がつかなくなるのか、 わかる方いらっしゃいましたら教えてください. バーションはPHP4.2.3です。

    • ベストアンサー
    • PHP
  • htmlspecialcharsの正しいタイミング

    htmlspecialcharsを使うタイミングがいまいちわかりません。 調べてみると、html出力時だということがわかりました。 mysqlを使った場合は以下の手順、 、 (1)フォームの内容をmysql_real_escape_stringしてデータベースに保存 (2)データベースから取り出すとき、htmlspecialcharsして出力する。 だとわかりましたが、ここで疑問点があります。 これまで掲示板などをデータベースを使わずファイル保存で作る場合、 (1)フォームの内容をhtmlspecialcharsしてファイルに保存 (2)foreachですべて表示 というやり方をしていましたが、正しくは、 (1)htmlspecialcharsせず、そのままファイルに保存 (2)foreachで表示するとき、htmlspecialcharsする という順序なのでしょうか?? わかりにくくて申し訳ないのですが、ご教授ください。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • 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
  • htmlspecialcharsの挙動について

    PHPのhtmlspecialcharsについての質問です。 とあるフォームで、「情報登録フォーム」→「確認ページ」→「完了ページ」という構成でプログラムを組んでいます。 タグはエスケープした状態でDBに保存しようと思ってます。 &lt;b&gt;カズン&lt;/b&gt;のようにエスケープした文字列をPOST送信したらもとの<b>カズン</b>に戻るという現象に見舞われてます。 まず「情報登録フォーム」で下記のように値をおくります。 <input type="text" name="shop" value="<b>カズン</b>" /> 「情報登録フォーム」でタグが入ってもてもエスケープできるように、「確認ページ」の出力時にhtmlspecialcharsを使っています。 結果、下記のようになります。 <input type="hidden" name="shop" value="&lt;b&gt;カズン&lt;/b&gt;" /> 次にこの値を「完了ページ」にPOSTで送ろうとしたら元の<b>カズン</b>にかわってしまいます。 「完了ページ」で再度htmlspecialcharsをかけたら&lt;b&gt;カズン&lt;/b&gt;になるんですが。 私は&lt;b&gt;カズン&lt;/b&gt;は普通にPOSTすれば&lt;b&gt;カズン&lt;/b&gt;が送られてくると仮定してたのですが、これは正しい仕様なのでしょうか?

    • 締切済み
    • PHP
  • htmlspecialcharsについて(セキュリティ)

    PHP5&MySQL5(OS:XP)で、テキストボックスに文字をいれ、DBに書き込む処理を作成しています。 「htmlspecialchars」を利用してセキュリティをかけたいのですが、htmlspecialcharsを使っても使わなくても同じ結果(セキュリティがきかない)が出てきてしまいます。 何が理由がお分かりの方、教えていただけると助かります。 ---ソース if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "formComment")) { $insertSQL = sprintf("INSERT INTO comment_table (entry_id, name, email, url, `comment`) VALUES (%s, %s, %s, %s, %s)", GetSQLValueString($_POST['entry_id'], "int"), GetSQLValueString($_POST['name'], "text"), GetSQLValueString($_POST['email'], "text"), GetSQLValueString($_POST['url'], "text"), GetSQLValueString($_POST['comment'], "text")); を if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "formComment")) { $insertSQL = sprintf("INSERT INTO comment_table (entry_id, name, email, url, `comment`) VALUES (%s, %s, %s, %s, %s)", GetSQLValueString(htmlspecialchars($_POST['entry_id']), "int"), GetSQLValueString(htmlspecialchars($_POST['name']), "text"), GetSQLValueString(htmlspecialchars($_POST['email']), "text"), GetSQLValueString(htmlspecialchars($_POST['url']), "text"), GetSQLValueString(htmlspecialchars($_POST['comment']), "text")); に変えています。 また、$_POST['comment']の入力文字は、 <script type="text/Javascript">window.alert('Javascriptが実行されました');</script> でも <iframe width="500" height="250" src="http://book.xxxx.co.jp/"></iframe> でもタグの内容通りの結果が表示されてしまいます。

    • ベストアンサー
    • PHP
  • 関数htmlspecialcharsと関数sqlite_escape_stringの扱い方

    いつもお世話になっております。 環境:PHP5/SQLite3 関数 htmlspecialchars 関数 sqlite_escape_string サイトのセキュリティを考慮し、 上記2関数をなんとなく利用しているのですが、 この「なんとなく」を卒業したいと思っています。 アドバイスして頂きたい内容を書きますと、下記のようになります。 ---------------------------------------- 上記の2関数のうまい使い分けと言いますか、 「こういう時にはこっち!ああいう時には、あっち! んでもって、 これこれこういう時には、どっちも使え!」 ---------------------------------------- というようなアドバイスを期待しております。 DBのクエリ文に使用しないような場合でも、 sqlite_escape_string関数で浄化しておいて損はないように思うのですが、 そういう使い方だと何か問題はありますでしょうか。 (無視できるような小さな問題であれば、気にしないつもりです。) 浄化能力を包含関係で考えると、 htmlspecialchars ⊂ sqlite_escape_string と私は考えていますが、違いますでしょうか。 それと、これらの関数の、 使うタイミングと使う際の注意事項 についても、あれこれお話し頂けると嬉しいです。 具体例(コードorシチュエーション)を示して頂けると助かります。 他にも、こんな関数でも浄化できます、 というようなアドバイスも大歓迎です。 と、とても抽象的な質問文になりましたが、、、 どなたか、「ワンポイントアドバイス」でも結構ですので、 どうか宜しくお願い致します。

    • 締切済み
    • PHP
  • mysqlにデータ登録

    phpでフォームに入力された値をDBに登録するとします。 例えば会員登録とした場合、基本的にhtmlは不要です。確認用にブラウザに表示する際には htmlspecialcharsを用いて(strip_tagsもでしょうか)エスケープすると思うのですがエスケープした データをDBにいれるのはまずいですか? 表示用とは別に生のデータを取得してそっちをDBに入れるという話を聞いたのですがどっちがいいのでしょうか? ブログなどhtmlの要素の登録する必要があるデータであればエスケープしたのは表示する際に手間が 掛かりそうなのでその場合はわかるのですがどのようにするべきなのでしょうか? DBに登録の際は、プリペアドステートメントを利用しています。

    • ベストアンサー
    • PHP
  • PHPでフォームからデータを受け取る

    PHPでwebページのフォームからデータを受け取り、データをtxtに書き込みするものを作っているのですが、その際にhtmlタグを受け取ると荒らされる可能性があると聞く事があるのですがどういった場合なのでしょうか。 一応htmlspecialcharsを施してはいるのですが、何のためかがよくわからなくて質問しました。 よろしくお願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう