いくつかのタグと属性を保存するHTML文字列のクリーニング
-
30-09-2019 - |
質問
サニタイズ関数を実装した後(要求された詳細に従って)、上司は受け入れられた入力を変更することにしました。今、彼は特定のタグとその属性を保持したいと考えています。私はより安全な私見であるが、それが多くの仕事になるので、彼は望んでいないBBCodeのような言語を実装することを提案しました。
今回はシンプルに保ちたいので、次回彼が私にこのことを変えてくれるように頼むときは彼を殺さないようにしたいと思います。そして、私は彼がそうすることを知っています。
最初に使用するだけで十分ですか strip_tags
保存するタグパラメーターを使用してください htmlentities
?
解決
strip_tags
必ずしも安全なコンテンツをもたらすとは限りません。 strip_tags
に続く htmlentities
HTMLエンコードされたものは何でも安全ですが、意味をなさないという点で安全です。
ユーザーがプレーンテキストを入力している場合、その場合は使用して出力する必要があります htmlspecialchars
(優先的に htmlentities
)、またはそれらはHTMLマークアップを入力しています。その場合、それを適切に解析し、壊れたマークアップを修正し、安全なホワイトリストに含まれていない要素/属性を削除する必要があります。
それがあなたが望むものであるなら、既存のライブラリを使用してそれを行います(例: htmlpurifier)。それは些細な作業ではないので、間違っている場合、XSSセキュリティホールを自分に与えたからです。
他のヒント
特定のタグを使用しておくことができます strip_tags
この構文で: strip_tags($text, '<p><a>');
そのスニペットは、すべてのタグを除外します p
と a
. 。あなたが許可したタグに対して属性は保持されます(p
と a
上記の例で)。
ただし、これは属性が安全であることを意味するものではありません。彼は特定の属性を望んでいますか、それともそれらすべてを許可されたタグに留めたいですか?最初のケースでは、各タグを解析し、必要なタグを削除し、値を消毒する必要があります。許可されたタグにすべての属性を保持するには、それらを消毒する必要があります。実行することをお勧めします htmlentities
それらを消毒するための属性値について(表示するために、私は想定します)。