htmlspecialcharsの正しいタイミング

このQ&Aのポイント
  • htmlspecialcharsを使うタイミングは、html出力時です。
  • mysqlを使った場合は、フォームの内容をmysql_real_escape_stringしてデータベースに保存し、データベースから取り出すときにhtmlspecialcharsして出力します。
  • 掲示板などをデータベースを使わずファイル保存で作る場合は、フォームの内容をhtmlspecialcharsせずにそのままファイルに保存し、表示するときにhtmlspecialcharsします。
回答を見る
  • ベストアンサー

htmlspecialcharsの正しいタイミング

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

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

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.1

>(1)htmlspecialcharsせず、そのままファイルに保存 >(2)foreachで表示するとき、htmlspecialcharsする それで正しいです。htmlspecialchars は、ファイルに保存する時じゃ無くて、HTMLとしてクライアントに返すとき(echo等)に行います。 なので、 >(2)データベースから取り出すとき、htmlspecialcharsして出力する。 も、データベースから取り出し後に編集などが入るなら、取り出し時じゃ無くて、編集後の出力直前で行います。

infinity38
質問者

お礼

これで迷いなく書けます。 ご回答頂き、ありがとうございました。

関連するQ&A

  • 括弧内の処理の順序

    プログラムを見ていて気になった点があります。 htmlspecialchars(mysql_real_escape_string(stripslashes($_POST["inp01"])),ENT_QUOTES) 上記の書き方の場合、処理される順番は 内から「stripslashes」→「mysql_real_escape_string」→「htmlspecialchars」になるんでしょうか? 逆に 外から「htmlspecialchars」→「mysql_real_escape_string」→「stripslashes」 でしょうか。 また処理の順番ですが、 「htmlspecialchars」→「stripslashes」→「mysql_real_escape_string」が正しい形でしょうか。

    • ベストアンサー
    • PHP
  • html用とmysql用のエスケープ処理の両立方法

    一度htmlspecialcharsしたものをmysql_real_escape_stringしてはいけない、そうです。 下記のように$pageをブラウザに表示もして、mysqlでも使う場合はどうするのでしょうか。 先にmysql_real_escape_stringを使い終わった後に、 htmlspecialcharsを使うような構造になるように工夫するのでしょうか。 htmlspecialcharsは出力する直前に使用しなければならないですが、 mysql_real_escape_stringは直前でなくても構わないとのことなので そこも意識して・・・ $mysql = mysql_connect($HostName,$UserName,$Password); $page = mysql_real_escape_string($_GET['page']); $mysql_c = "SELECT * FROM tttttt WHERE page='$page'"; $mysql_q = mysql_query($mysql_c,$mysql); $page = htmlspecialchars($_GET['page']); $html = '<a href="?page='.$page.'">'.$page.'</a>'; <html> <body> <div><?php echo $page; ?></div> 他には方法がないのでしょうか。

    • ベストアンサー
    • PHP
  • 「addslashes」と「htmlspecialchars」について

    「addslashes」と「htmlspecialchars」について、いくつか分からない点があるので、教えてください。 ■質問1. http://kezy.org/2009/10/04/php-get-post 関数化している例が掲載されているのですが、このやり方を真似してもよいものでしょうか? http://kmaebashi.com/zakki/zakki0042.html ここでは、それぞれの処理の直前に行うべきと書かれていて、 また別のサイトでも、用途に沿った処理方法で、と書かれているのですが、 「addslashes」と「htmlspecialchars」を一つの関数にまとめることは、次のどれに当たるでしょうか? ・別に問題ない ・奨励はしないけど、間違いではない ・止めたほうがよい ※二つを関数化すると、便利だと思うのですが、必要ないところにもサニタイズ処理等がかかるのかな、と思い、そこら辺が問題ないかよく分からなかったので、質問しました。 ■質問2.MySQLを利用する場合は、「addslashes」より、「mysql_real_escape_string」を利用したほうがよいのでしょうか? 両者の違いは何でしょうか? ■質問3.プリペアド・ステートメントを使うのであれば、該当フォーム部分については、別にSQLインジェクション対策をしなくてもよいのでしょうか? あるいは、プリペアド・ステートメントを利用しても、あくまでも攻撃を受ける可能性が下がるだけ(?)なので、「addslashes」をしとくべきなのでしょうか? ※なんでもかんでもやればいいってものでもないのかな? と思い、質問しました。

    • ベストアンサー
    • PHP
  • pg_escape_stringとhtmlspecialcharsの記述の仕方について

    お世話になります。フォームで入力した値をpostでPHPに送ってます。 その際にセキュリティを考えてpg_escape_stringとhtmlspecialchars関数を使用したいのですが、簡単な記述方法が分かりません。 今現在は下記のようにしてます。 $tesuto=pg_escape_string(@$_POST["tesuto"]); $tesuto="'" .htmlspecialchars($tesuto) ."'"; フォームで入力する項目が20箇所あるので、これをスマートに 記述する方法は無いでしょうか?よろしくお願いします。

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

    原則からはずれるのですが、htmlspecialcharsをあえて、mysqlに登録する前に使えませんか? 例えば1000行10カラムを表示する場合、1万回もhtmlspecialcharsを使わなくてはいけないので、何とか軽く処理できないかと思いました そこでhtmlspecialcharsを使って変換してからmysqlに登録したいのです 変換した文字がmysqlに不具合を与えることはありますか? &amp; &quot; ' &lt; &gt;

    • ベストアンサー
    • PHP
  • DBから出力の際preg_replace等が効かぬ

    データベースを使ったウェブサイト。 POSTを使ったformタグより、textareaにてテキストをsql文にて、 MySqlにinsertし、(このときにmysql_real_escape_string) 読み出すときにhtmlspecialcharsしてprint。 これが一般的な流れなのですが、 上記のまま行うと、改行(\r\n)がウェブ上に見えてしまいます。 ですので、 1:print preg_replace("/\r\n/","<br />", htmlspecialchars($ans['Pt_txt1'], ENT_QUOTES, 'UTF-8')); 2:print nl2br(htmlspecialchars($ans['Pt_txt1'], ENT_QUOTES, 'UTF-8')); などをやって消そうとしているのですが消えません。 ためしに、 $aaa ="適当な文字"; 1:print preg_replace("/\r\n/","<br />", htmlspecialchars($aaa, ENT_QUOTES, 'UTF-8')); 2:print nl2br(htmlspecialchars($aaa, ENT_QUOTES, 'UTF-8')); のように、MySqlを介さずに直接出力した場合、 ちゃんと改行コードは<br />に変更してくれましたので ソースの記述ミスではないと思うのです。 原因はなににあるでしょうか。 なお、現状phpmyadminで覗くと、 「フィールドA」(mysql_real_escape_stringを通してinsert) ----- あいうえお\r\nかきくけこ ----- 「フィールドB」(mysql_real_escape_stringを通さずにinsert) ----- さしすせそ たちつてと ----- となっているフィールドがありますが、 それらがhtmlで出力されたもののソースを見ると、 ----- A:あいうえお\r\nかきくけこ B:さしすせそ<br />たちつてと となぜかBのほうが希望通りの動きをします。 cを通さずにDBに入れてしまったほうが希望通りに動きます。 さっぱり困りました。

    • ベストアンサー
    • MySQL
  • SQLインジェクション対策

    SQLインジェクション対策で $hoge = htmlspecialchars($hoge); $hoge = mysql_real_escape_string($hoge); を使おうと思っていますが、どちらを先に書けばよいでしょうか?

    • 締切済み
    • PHP
  • エラーの意味と対策

    PHP-MySQL間でデータを更新するプログラムを作成、PHPファイルを 読み出し更新を行おうとしたところ、以下のメッセージが表示されました。 データの更新はできているのですが、このメッセージがよくわかりません。 Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'ODBC'@'localhost' (using password: NO) in E:\(ディレクトリ)\delete.php on line 106 Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in E:\(ディレクトリ)\delete.php on line 106 ここに書かれているコードはSQLで $sql_update = "UPDATE ITEM SET DELETE_FLAG=1,LASTUPDATE_USER='".htmlspecialchars(mysql_real_escape_string($_COOKIE["loginuser"]),ENT_QUOTES)."',LASTUPDATE_DTTM=NOW() WHERE ITEM_ID=".$key; となっています。 今のところ「mysql_real_escape_string」をはずすとエラーが出ないのですが、 エラーの意味、原因、対策についてコメントいただければと思います。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • フォームのエラーチェックを教えてください

    ドリームウェーバー8で、MySQLとPHPでサイトを作っています。 フォームを使ったデーターベースへの書き込みの時に、フォーム上で「送信」をクリックした時にPHPによるエラーチェックをしたいと思います。なかなかできずに、困ってます・・・ 構文が長いので、質問内容にはいらない・・・どうしよ <?php if (!function_exists("GetSQLValueString")) { //文字列をSQLコマンド用に「'」を付加する function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") { //magic_quotes_qpcの設定に応じて値を変換する $theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue; $theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue); まだ、続きがあります・・・

    • 締切済み
    • PHP
  • PHPのPDOについて

    例えば手続き型でしたら、値をデータベースに追加するとき $sql = sprintf( 'INSERT INTO member SET id=%d, message="%s" ', mysql_real_escape_string($id), mysql_real_escape_string($message) ); mysql_query($sql) or die(mysql_error()); など「mysql_real_escape_string」を使って多少なりともセキュリティーをかけると思うのですが、PDOですと下記に書かれている以外に見たことないのですが、「mysql_real_escape_string」などはやらなくても大丈夫ということなのでしょうか? PDOの場合 $sql = 'INSERT INTO member SET id=?, message=?'; $stmt = $db->prepare($sql); $stmt->execute(array($id, $message)); 色々調べてみたのですがいまいち分からないためよろしくお願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう