現在、サイトに表示される投稿やコメントの送信をユーザーに要求するアプリケーションに取り組んでいます。ユーザー入力は信頼できないことは誰もが知っているので、htmlspecialchars($ string、ENT_QUOTES)を使用してユーザーの投稿とコメントを処理しました。
今、私はいくつかの特定のhtmlタグを無視したいです。など<b><br />
といくつかのタグ。htmlspecialcharsが一部のタグを無視し、他のタグをフィルタリングするようにするにはどうすればよいですか。
現在、サイトに表示される投稿やコメントの送信をユーザーに要求するアプリケーションに取り組んでいます。ユーザー入力は信頼できないことは誰もが知っているので、htmlspecialchars($ string、ENT_QUOTES)を使用してユーザーの投稿とコメントを処理しました。
今、私はいくつかの特定のhtmlタグを無視したいです。など<b><br />
といくつかのタグ。htmlspecialcharsが一部のタグを無視し、他のタグをフィルタリングするようにするにはどうすればよいですか。
解決策a)
htmlspecialcharsの代わりにstrip_tagsを使用し、必要なタグをホワイトリストに登録します。
より良い解決策b)
bbcodeを使用し、必要なタグにエイリアスを付けます。例:[b] bold [/ b]
スクリプトインジェクションなどの可能性を許可せずに、一部のHTMLタグのみを許可することは非常に困難です。
実際には、これを避けて、このUBBコードパーサー(または同様のもの)などのHTMLを生成するものを使用することをお勧めします。または、Markdown(HTMLオプションがオフになっている場合)もあります。
これにより、攻撃者がサイトを攻撃する可能性がなくなります。これは、公開されている場合は非常に重要です。
一部のHTMLを許可した場合でも、断固とした攻撃者がHTMLを回避する方法を見つける可能性があります。
不十分または安全でないHTMLフィルターの現在の状況のためにBBCodeを使用するのにうんざりしていませんか?-> HTMLピューリファイヤー
HTML Purifierは、PHPで記述された標準準拠のHTMLフィルターライブラリです。HTML Purifierは、徹底的に監査され、安全でありながら寛容なホワイトリストを使用して、すべての悪意のあるコード(XSSとして知られる)を削除するだけではありません...
引用符で囲まれた文字列を置き換えて、許可されたタグを再挿入できます。たとえば<b>
タグの場合:
$string = str_replace(array('<b>', </>), array('<b>', '</b>'), $string);
私は、非常に明確で完全なタグのみを可能な限り安全にすることを許可します。つまり、必要がない場合は正規表現を使用しないでください。非常に厄介なバグが発生する可能性があります。
特定のタグを無視するオプションhtmlspecialchars()
も提供されていないため、これはあなたが思うほど単純ではありません(両方の関数はタグの概念の意味さえ知りません)。htmlentities()
BBCode、Textile、Markdownなど、他の手段を使用してユーザーが投稿をフォーマットできるようにすることができます。それらすべてに利用可能なPHPパーサーがあります。
htmlタグを使用する必要がある場合は、許可されたタグを再フォーマットして、の影響を受けないようにする前処理を利用できますhtmlspecialchars()
。その後、結果を後処理して、形式を通常のHTMLタグに戻すことができます。次のサンプルは、単純なタグのこのプロセスを視覚化したもの<a>
です。正規表現を使用したHTMLの処理はエラーが発生しやすく、常に実行できるとは限らないことに注意してください。この例では、わかりやすくするために使用します。
$input = preg_replace('~<(/?\w+([^>]*?))>~', '|#$1#|', $input);
$input = htmlspecialchars($input);
$inoput = preg_replace('~|#(/?\w+(.*?))#|~', '<$1>', $input);
これはテストされておらず、確かにもっと多くの作業が必要になります。
ユーザー入力によるフィルタリングには、Zend_Filterを使用することを強くお勧めします。具体的には、http: //framework.zend.com/manual/en/zend.filter.html#zend.filter.introduction.usingを参照してください。