• ベストアンサー

HTMLエスケープ処理とデーターベース

初歩的な事で申し訳ありませんがご教授下さい。 フォームから受け取った文字列をデータベースに格納し、必要に応じて出力するような処理でのHTMLエスケープについて質問です。 (前提条件として、HTMLタグは使用をさせない。フォームに入力する文字列には、< や >を使う必要性はほとんどないものとします) HTMLエスケープ処理は、どのタイミングで行うのが普通でしょうか? 1.JavaScliptで特定文字 < や > を入力させない。 2.サーバーサイドで特定文字 < や > を入力させない。 3.DBに格納する前にエスケープして、エスケープ処理後の文字列をDBに格納する。 4.DBにはそのまま格納し、出力のさいにエスケープ処理を行う。 5.どこでもかまわない。 6.その他 今まで私はあまり意識する事なく(4)を選択していたのですが、最近他の人の作ったプログラムを見る機会が増えて、その違いにちょっと気になりました。 正解はないのかも知れませんが、一般的な方法と、そのメリット、デメリット等、教えて頂けると助かります。

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

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

  • ベストアンサー
  • racci
  • ベストアンサー率64% (9/14)
回答No.3

HTMLタグを使用させないようなアプリケーションでは、4が正解です。 1 簡単に回避できるので、意味がありません。 2 < や > を許容するケースでは通用しません。 3 DBのデータはHTMLに出力する用途以外にも使う事があります。例えばCSVファイルに落として、宛名出力するなどの用途です。DBのデータは「生の文字列」にしておくのが望ましいです。 HTMLエスケープはHTML生成時に行なう、SQLエスケープはSQL生成時に行なう、などが基本です。

yoshi_t
質問者

お礼

>3 DBのデータはHTMLに出力する用途以外にも使う事があります。例えばCSVファイルに落として、宛名出力するなどの用途です。DBのデータは「生の文字列」にしておくのが望ましいです。 確かにHTML出力以外に利用したい時には元の文字列に戻す事が困難ですね。 各ケースにおいて、具体的に説明していただいた事でとても参考になりました。 ありがとうございました。

その他の回答 (2)

回答No.2

私が教わった物は出力時にエスケープをすると言うものでした。 つまり4番ですね。 それが絶対に正しいとは思いませんが、現在のところはそれが基本なのではないかな?と思います。 もちろんSQLインジェクションなどを防がなくてはならないので、DB格納前にはSQL用エスケープ処理が必要になります。

yoshi_t
質問者

お礼

専門家の方の意見を聞けて、ひとまず安心しました。 エスケープのタイミングをどこで行うかによって、かなり内部ロジックが変わってくるので... ひとまず基本的な方法をとっておけば、他の人がソースを修正するような場合、困らないと思うので! 私自身、まだPHP初心者なので、他の人のソースを読むとき苦労する場合があります。 なるべくコメントをいれて、一般的な方法でコーディングするように心がけようと思っていますが、今回の件がちょっと気にかかったもので、質問させて頂きました。 回答ありがとうございました。

  • manoh
  • ベストアンサー率60% (9/15)
回答No.1

5.は当然問題外として、1.2.は使用用途によると思います。 例えばタグ入力可能な掲示板やブログなどを作成するのであれば、入力制限を行っては本末転倒ですし。 この辺はポリシーの問題ですね。 ガチガチにセキュリティを意識して作るのであれば、1.2.を実装しても良いと思います。 3.4.ですが、自分は3.の段階で処理を行っています。 ここで処理しないとデータベースへのINSERTに失敗する可能性が非常に高いからです。 また一般的な方法としては、PEARのクラスを使用するのが一般的ではないかと思います。

yoshi_t
質問者

お礼

回答ありがとうございます。 >3.4.ですが、自分は3.の段階で処理を行っています。 >ここで処理しないとデータベースへのINSERTに失敗する可能性が非常に高いからです。 この件については、知りませんでした。 実際に私が見た他の人のプログラムでは、(3)の方法をとっている方がいました。 この件を考慮して、(3)の方法をとっていたのですね。 参考になりました。 ありがとうございました。

関連するQ&A

  • HTMLタグを機能させて出力する際のエスケープ処理

    「HTMLタグを機能させて出力する」際のエスケープ処理は、どうすれば良いでしょうか? <例> ビューファイルの<head>タグ内に、下記のような文字列を渡して、実際に、タグとして機能させたい場合 <link rel="stylesheet" href="hoge.css"> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> この場合、やり方としては、通常の文字列を渡すときのように、htmlspecialcharsで一旦「HTML エンティティに変換」した後、何らかの方法(htmlspecialchars_decode?)で元に戻すのでしょうか? それとも、「HTML エンティティに変換」した後、再変換してタグとして使うことが明白な場合は、わざわざ「HTML エンティティに変換」する必要はないのでしょうか? つまり、「HTMLタグを機能させて出力する」際のエスケープ処理は必要ない。やることと言えば、せいぜい、セッターで一旦、privateプロパティへ格納後、ゲッターで取り出すぐらい、なのでしょうか?

    • ベストアンサー
    • PHP
  • htmlタグがあるデータのエスケープ処理

    今 phpを勉強していて自分の勉強用にブログを作ろうと思っています。 ですが、その事で分からないことがあり、質問させていただきます。 それは、データベース内にある記事データのエスケープ処理についてです。 記事データを日付順やカテゴリーごとに並べて出力する際にエスケープ処理をすると htmlタグがもちろんそのまま出力されてしまいます。 自分が参考にした本では出力するデータは全てエスケープするべきだと書かれていましたが、 今回のようなケースはどうすればいいのでしょうか? 1, ユーザー入力ではなく、運営者のみが入力するデータの場合、エスケープは必要ないのでしょうか?   その場合セキュリティの問題はないのでしょうか? 2, それとも全ての場合においてエスケープ処理は必要で、htmlタグを含んだデータを   データベースに入れるのが問題なんでしょうか? どなたか回答お願いします。

    • ベストアンサー
    • PHP
  • HTMLエスケープすべき場所について教えてください。

    HTMLエスケープすべき場所について教えてください。 エスケープ処理は、利用目的に応じてなるべく直前に行なう、という原則に基づくと、 下記考え方で合っているでしょうか? ■確認したい項目1. ▽受取側のページ 例えば、if(isset(($_POST['hoge'])){~ の時点では、存在確認をしているだけなので、エスケープ処理は必要ない。 ■確認したい項目2. 自由入力できるテキスト欄は、POST・GETどちらも、画面表示処理の直前に、エスケープ処理が必要。 ■確認したい項目3. ▽予め選択肢があるプルダウン等 →POST…送信データを変更される可能性がないため、エスケープ不要。 →GET…ブラウザのURL欄を通じて送信データを変更される可能性があるため、エスケープは必要。 ■確認したい項目4. hiddenで送信するデータは、POST・GETどちらも送信データを変更される可能性がないため、エスケープ不要。 この考え方で、合ってますでしょうか? なるべく推奨されるやり方で書きたいと思いますので、アドバイスをよろしくお願いします。

    • ベストアンサー
    • PHP
  • HTMLタグのエスケープ文字をタグに戻す方法

    JavaのBufferedReaderクラスを使用して HTMLファイルを1行ずつ読み込んでまた、別のファイルに出力したところ HTMLファイル内では <br /> と表示されているところが出力ファイルでは &lt;br /&gt; というようにエスケープ文字で出力されてしまいました。 タグをそのまま出力したいのですがエスケープ文字で出力されないようにするためには どのようにすればよろしいでしょうか。

    • ベストアンサー
    • Java
  • 文字列のエスケープ処理

    VB6.0を使用してXMLファイルを作成しています。 XMLファイルの値に日本語文字列の場合のみ、エスケープ処理した文字列をセットしなければいけない場所があるのですが、 エスケープ処理した文字列とはどのように実現できるのでしょうか? XML自体があまり詳しくないので、質問内容がおかしいかも知れませんが、どなたかお教えください。 よろしくお願いします。

  • htmlspecialcharsを使ったエスケープ処理

    APIを使ってPHPでWEBサイトを構築しているのですが htmlspecialcharsを使ったエスケープ処理はいつ行うべきなのでしょうか? フォームから入力された値だけでよいのでしょうか?? いまいち理解していないのでアドバイスお願いします。

    • ベストアンサー
    • PHP
  • HTML エスケープ関数のオプション

    PHP にビルトインの HTML エスケープ関数でいったんエスケープされた文字列 (たとえば &quot;) をもう一度この関数に通すと、アンパサンドが再度エスケープされてしまいます (たとえば &amp;quot;)。 何の必要性が生じるのかと言えば、たとえばプレビューのためにエスケープし、プレビュー画面にてユーザにより値が変更されてアンパサンドが再度含まれたときにはそれが &amp; に変更される必要があるものの、&quot; などはそのまま通したいということです。 そこで出てくるのが観点ですが、そもそも組込みの HTML 関数を使わなければ解決ということはあるのですが、そういう観点ではなく、この組込み関数に上述の問題を避けるようなオプションは存在しないのかということです。 要は、質問はそれだけです (問題の解決は上述の通り可能なので、この点はよいです)。

    • 締切済み
    • PHP
  • エスケープしたくない、けど、したいのもある

    とあるテキストデータ(.txt)を読み込み、それを表示するスクリプトをPHPで作りました。 その際、もしテキストデータにHTMLタグが入っている場合、そのまま出力させて、タグが有効になるようにしています。 (というかテキストを何も処理せずそのまま出力するだけ) (セキュリティ的には、テキストデータは信頼できる自サイトの同一ディレクトリに置いてあるものからしか読み込ませないようになっています) しかし、今度は逆に、もしそのテキストデータに「<hoge>」などの文字がふくまれていた場合、ブラウザはそれをタグと認識し、見えない表示になります。 本当は見えるようにそこは「&lt;hoge&gt;」と出力してほしいわけです。 かと言って、 echo htmlspecialchars($txt, ENT_QUOTES|ENT_HTML5, "UTF-8"); などエスケープして出力すると、今度はHTMLタグとして出力させたい「<br>」なども「&lt;br&gt;」として出力されてしまい都合が悪いです.. ようは、 「こんにちは<hoge><br>ほげ」 という文字列のテキストを、 「こんにちは&lt;hoge&gt;<br>ほげ」 と出力してほしい.. もちろんテキストは「hoge」であるとは限りません。 何かよい解決方法はないでしょうか? ご教示頂けましたら幸いです。

    • ベストアンサー
    • PHP
  • htmlentitiesとはエスケープ処理?

    htmlentitiesとはエスケープ処理をするための関数なのでしょうか? string htmlentities ( string string, int [quote_style] , string [charset] ) この関数はhtmlspecialchars()と同じですが、 HTML エンティティと等価な意味を有する文字をHTMLエンティティに変換 します。

    • ベストアンサー
    • PHP
  • 携帯からの絵文字をWebで再現するには?

    HTML_Emojiでいい感じになるかと思ったんですが、フォームからの入力ではなく、携帯端末から受け取った絵文字メールをサーバーで解析してWeb画面に出力したいです。 受け取ったメール本文を ISO-2022-JP から UTF-8 に変換してDBに格納してSELECTして、HTML_Emoji咬ませて画面出力したいのですが、DB格納時点で「?」に文字化けしています。 何かしら回避策はあるのでしょうか? 無理なら「無理」と答えが欲しいです。

    • 締切済み
    • PHP

専門家に質問してみよう