• ベストアンサー

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

初歩的な事で申し訳ありませんがご教授下さい。 フォームから受け取った文字列をデータベースに格納し、必要に応じて出力するような処理でのHTMLエスケープについて質問です。 (前提条件として、HTMLタグは使用をさせない。フォームに入力する文字列には、< や >を使う必要性はほとんどないものとします) HTMLエスケープ処理は、どのタイミングで行うのが普通でしょうか? 1.JavaScliptで特定文字 < や > を入力させない。 2.サーバーサイドで特定文字 < や > を入力させない。 3.DBに格納する前にエスケープして、エスケープ処理後の文字列をDBに格納する。 4.DBにはそのまま格納し、出力のさいにエスケープ処理を行う。 5.どこでもかまわない。 6.その他 今まで私はあまり意識する事なく(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