初歩的な事で申し訳ありませんがご教授下さい。
フォームから受け取った文字列をデータベースに格納し、必要に応じて出力するような処理でのHTMLエスケープについて質問です。
(前提条件として、HTMLタグは使用をさせない。フォームに入力する文字列には、< や >を使う必要性はほとんどないものとします)
HTMLエスケープ処理は、どのタイミングで行うのが普通でしょうか?
1.JavaScliptで特定文字 < や > を入力させない。
2.サーバーサイドで特定文字 < や > を入力させない。
3.DBに格納する前にエスケープして、エスケープ処理後の文字列をDBに格納する。
4.DBにはそのまま格納し、出力のさいにエスケープ処理を行う。
5.どこでもかまわない。
6.その他
今まで私はあまり意識する事なく(4)を選択していたのですが、最近他の人の作ったプログラムを見る機会が増えて、その違いにちょっと気になりました。
正解はないのかも知れませんが、一般的な方法と、そのメリット、デメリット等、教えて頂けると助かります。
No.3ベストアンサー
- 回答日時:
HTMLタグを使用させないようなアプリケーションでは、4が正解です。
1 簡単に回避できるので、意味がありません。
2 < や > を許容するケースでは通用しません。
3 DBのデータはHTMLに出力する用途以外にも使う事があります。例えばCSVファイルに落として、宛名出力するなどの用途です。DBのデータは「生の文字列」にしておくのが望ましいです。
HTMLエスケープはHTML生成時に行なう、SQLエスケープはSQL生成時に行なう、などが基本です。
>3 DBのデータはHTMLに出力する用途以外にも使う事があります。例えばCSVファイルに落として、宛名出力するなどの用途です。DBのデータは「生の文字列」にしておくのが望ましいです。
確かにHTML出力以外に利用したい時には元の文字列に戻す事が困難ですね。
各ケースにおいて、具体的に説明していただいた事でとても参考になりました。
ありがとうございました。
No.2
- 回答日時:
私が教わった物は出力時にエスケープをすると言うものでした。
つまり4番ですね。
それが絶対に正しいとは思いませんが、現在のところはそれが基本なのではないかな?と思います。
もちろんSQLインジェクションなどを防がなくてはならないので、DB格納前にはSQL用エスケープ処理が必要になります。
専門家の方の意見を聞けて、ひとまず安心しました。
エスケープのタイミングをどこで行うかによって、かなり内部ロジックが変わってくるので...
ひとまず基本的な方法をとっておけば、他の人がソースを修正するような場合、困らないと思うので!
私自身、まだPHP初心者なので、他の人のソースを読むとき苦労する場合があります。
なるべくコメントをいれて、一般的な方法でコーディングするように心がけようと思っていますが、今回の件がちょっと気にかかったもので、質問させて頂きました。
回答ありがとうございました。
No.1
- 回答日時:
5.は当然問題外として、1.2.は使用用途によると思います。
例えばタグ入力可能な掲示板やブログなどを作成するのであれば、入力制限を行っては本末転倒ですし。
この辺はポリシーの問題ですね。
ガチガチにセキュリティを意識して作るのであれば、1.2.を実装しても良いと思います。
3.4.ですが、自分は3.の段階で処理を行っています。
ここで処理しないとデータベースへのINSERTに失敗する可能性が非常に高いからです。
また一般的な方法としては、PEARのクラスを使用するのが一般的ではないかと思います。
回答ありがとうございます。
>3.4.ですが、自分は3.の段階で処理を行っています。
>ここで処理しないとデータベースへのINSERTに失敗する可能性が非常に高いからです。
この件については、知りませんでした。
実際に私が見た他の人のプログラムでは、(3)の方法をとっている方がいました。
この件を考慮して、(3)の方法をとっていたのですね。
参考になりました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ランキングサイトのスパム登録...
-
httpでもログインフォームは暗...
-
バッチファイルで、全てのウィ...
-
XMLHttpRequestでウェブページ取得
-
Yahoo! JAPAN IDを新規取得でき...
-
PHPにて自動計算した値をデータ...
-
Dosブロンプトでtabを出力したい
-
なぜエラーが出るのか分からな...
-
Excel VBA:特定の文字列以降(...
-
DMMの動画を全件取得したのです...
-
excel access連携 このテーブル...
-
ps3で久しぶりにCDの音楽情報取...
-
複数のソースコードで一つの実...
-
phpの質問です
-
テーブルに送信ボタンをつける
-
INIファイル
-
INIファイルに一括書き込みを行...
-
phpでcookieがうまく保存されない
-
DTOとEntityの差は何ですか。
-
ログイン画面をはさんだ後、自...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
POSTで受け渡したものを保存し...
-
閉じるボタン「×」を制御したい
-
cURL関数を使用したphpからのpo...
-
IFRAME内PHPのセッション変数取...
-
ブラウザバックしてもチェック...
-
HTMLエスケープ処理とデーター...
-
ログイン画面から入って、「戻...
-
HTMLエスケープすべき場所につ...
-
PHPで値を保持する方法
-
VBAで重複チェックの仕方を教え...
-
[php]勤怠管理システムの作成中...
-
asp.netでのセッションを使用し...
-
セッション使用時のフォームの...
-
セッションを使用したページ遷移
-
飛び先のランダムURLの取得方法...
-
ユーザ管理システムを作りたい...
-
PHPで名寄せするには?
-
ページデザインとスクリプトを...
-
フォームを使わずにPOST送信す...
-
PHPの可逆暗号化関数について
おすすめ情報