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