ここから本文です

POSTメソッド、GETメソッドのサニタイジング、エスケープ処理の今現在の流儀 はな...

jub********さん

2015/4/209:44:52

POSTメソッド、GETメソッドのサニタイジング、エスケープ処理の今現在の流儀
はなんでしょうか?

input_fillter,htmlspecialchars,htmlentities等があると思います。

私の認識だと
①fillter_inputはXSSとSQLインジェクション両方の入力を文字列のエスケープ処理、サニタイジングするために使われる。
②XSS対策はhtmlspecialcharsを使い、これは4つの文字をエスケープ
③XSS対策はhtmlentitiesを使い、これは100つの文字をエスケープ

htmlspecialcharsはあまり使われませんか?
使うとしたらどういう場合に使いますか?

閲覧数:
1,590
回答数:
4

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

ryo********さん

2015/4/301:58:02

filter_inputは使うフィルタ次第でどんな用途にも使えるので、ここでは議論の対象とすることは避けます。ちなみにフィルタを指定しなかった場合は単純に「配列を除外する」「文字列のみを受け付ける」フィルタとして機能します。

【$_GET, $_POSTなどを受け取る際の処理】
http://qiita.com/mpyw/items/2f9955db1c02eeef43ea

質問者さんがイメージされているfilter_inputの用途は、XSSに関してはstrip_tagsの効果と同一であると思われるので、こちらを採用します。なおSQLインジェクション対策としては全く使えません、それはプリペアドステートメントのプレースホルダへのバインディングの役割です。

さて、本題に入ります。「HTML特殊文字を消去する」という目的で使用することは出来ますが、そもそもこの「フィルタリング」「サニタイジング」というアプローチ自体があまりよろしく有りません。最も望ましいのは「エスケープ」です。(徳丸さんのブログで紹介されているイメージに従う場合)

【サニタイズ言うなキャンペーン】
http://takagi-hiromitsu.jp/diary/20051227.html#p02

【バリデーション、エスケープ、フィルタリング、サニタイズのイメージ】
http://tumblr.tokumaru.org/post/69573778661

というわけでhtmlspecialcharsとhtmlentitiesの2択になるわけですが、原則的には前者で十分です。後者はセキュリティ対策としては過剰です。

  • ryo********さん

    2015/4/302:02:09

    「サニタイズ言うなキャンペーン」でも言及されていますが、

    『悪意のある入力があるかもしれないから何か処理を施す』

    という考え方は捨てるべきです。

    『入力された "text/plain" を "text/html" として表示させたいならhtmlspecialcharsを必ず通さなければならない』

    という考え方が正しいです。それ故にエスケープするタイミングも「HTMLとして出力する直前」が妥当です。

    【脆弱性対策におけるhtmlspecialchars()の使用箇所について】
    http://ja.stackoverflow.com/questions/2408/%E8%84%86%E5%BC%B1%E6%80...

  • その他の返信を表示

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

質問した人からのコメント

2015/4/4 22:05:44

本当に参考になりました。
ありがとうございます。

ベストアンサー以外の回答

1〜3件/3件中

並び替え:回答日時の
新しい順
|古い順

nic********さん

2015/4/301:37:53

入力値の検証と出力値の無害化はまったく別の処理だ。

入力値のフィルタは、特定の値以外の入力を防ぎたい時に行う。

それはそれとして、信用できない値をコードとして解釈される文脈で(つまりHTMLになりうる場所に書き出すとか、SQLを組み立てるとか、シェルに渡すコマンドとして組み立てるとか)使う場合は、その用途に応じた変換処理(エスケープ)をかける。
HTMLを書き出す時の変換処理としては、htmlspecialchars()が必要十分だ。htmlentities()は過剰。こいつは例えば日本語を含む出力ファイルをpure ASCIIとして表現したい、などの非常に特殊なケースで使う。

入力値に対する処理と、出力時の処理は、「両方」やるのが正解だ。数値の入力を受けてHTMLを書き出すなら、filter_var()かなんかで入力値が数値であるかを検証すべきだし、出力の際はhtmlspecialchars()をかけるべきだ。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

nox********さん

2015/4/218:42:43

いまどきXSS対策なんかしねぇ~よ。何十年前の話だよw
そんなのサーバ側で自動でやってくれるよw
XSS対策はめんどくせぇ~んだよw

agu********さん

2015/4/211:46:53

>illter_inputはXSSとSQLインジェクション両方の入力を文字列のエスケープ処理、サニタイジングするために使われる。

SQLインジェクション対策に使うというのは初耳です。どこに書かれていた情報でしょうか?

filter_inputは使うフィルタの違いで守備範囲が相当に広いのですが、どれを念頭に置かれていますか?POST/GETということですから、filter_inputの第一引数(type)がINPUT_POSTやINPUT_GETでの話だと思いますが・・・

http://www.php.net/manual/ja/filter.filters.php




>htmlspecialcharsはあまり使われませんか?

まず、htmlspecialcharsは「出力時」のエスケープであってPOST/GETで受け取ったときに使うものではありません。

私は出力時にはよく(というか必ず)使います。逆にhtmlentitiesを使って「適用可能な文字を全て HTML エンティティに変換する」必要はほとんどありません。htmlソース(の一部)として出力するときにはhtmlspecialcharsでじゅうぶんです。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

あわせて知りたい

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる