Web ベースのアプリケーションを開発していて、リッチ フォーマットのテキストをユーザーに許可したい場合、その入力を許可する方法を選択する必要があります。HTML のサニタイズは間違いなく難しいため、さまざまなマークアップ言語が作成されています。
次のようなさまざまなマークアップ言語の長所と短所は何ですか。
別の言い方をすれば、特定のマークアップ言語を使用する際にどのような要因を考慮しますか。
Markdown、BBCode、Textile、MediaWiki マークアップはすべて基本的に同じ概念なので、HTML とプレーン テキスト マークアップの 2 つのカテゴリに分類します。
HTML との取引は、コンテンツが既に Web コンテンツの「提示可能な」形式になっているということです。これは素晴らしいことであり、処理時間を節約し、容易に解析できる言語です。HTML コンテンツを処理したり、HTML から他のフォーマットに変換したり、HTML から他のフォーマットに変換したりするための、ほぼすべての言語のライブラリが多数あります。ユーザーから HTML を受け入れるとき、常に正気の入力に依存しているわけではありません。指摘したように、HTML の整頓またはサタンタイズは、特に XML のように通常のマークアップ規則に従わないため (つまり、不適切に閉じられたタグが一般的)、非常に困難な場合がよくあります。
このカテゴリは、次の理由で頻繁に使用されます。
結論は、ユーザー入力が使用されているものです。データを保持する予定があり、形式をシャッフルする必要がある場合などは、注意深い抽象形式を使用して情報を保存することをお勧めします。なんらかの理由で生データを手動で操作する必要がある場合、その形式が人間が簡単に読み取れる場合はボーナス ポイントです。コンテンツを Web ページ (またはレポートなどの HTML ドキュメント) に表示するだけで、コンテンツの変換や将来の保証について懸念がない場合は、コンテンツを HTML に保存することをお勧めします。
Jeffは、SO をまとめる初期段階にある間に、codinghorror.com でいくつかの長所と短所について議論しました。読みごたえのある作品だと思いました。
@netrox データベースは問題ではなく、ブラウザの出力は問題です。
唯一の懸念事項は、ユーザーが挿入した HTML によって破損する可能性がある最終的なレンダリングです。たとえば、ユーザーは<li>
タグを開くことができますが、それを閉じることはできません。ページの構造によっては、その後のレイアウト全体が壊れる可能性があります。あるいは、<strong>
タグを閉じずに開いて、残りのすべてのコンテンツを太字にする別の例です。
許可されたタグを検証する必要があるだけでなく、一部のタグを許可して他のタグを許可しないようにするにはどうすればよいでしょうか? たとえば、PHP メソッドを使用してすべての HTML タグの解析を防ぐのは非常に簡単htmlspecialchars()
ですが、一部のタグを許可する場合は、他の方法を探す必要があります。許可されていないタグを削除 (完全に削除) する PHP 関数がありstrip_tags()
ますが、それはユーザーのコンテンツを悪い方法で変更することを意味し、ユーザーが単純なコード (処理するコードではなく、共有/表示するコード) を投稿できなくなります。 .
レイアウトを壊すだけでなく、リンクの href 属性に JavaScript を挿入するなどの XSS 攻撃を考慮する必要があります。たとえば、ユーザーを別のサイトにリダイレクトする可能性があります。可能性のある XSS 攻撃の長いリストを参照してください: https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet
ご覧のとおり、すべての HTML タグが解釈されないようにするのは非常に簡単ですが、一部のタグのみを防止するのははるかに複雑です。それを理解するには、いくつかの HTML タグを許可し、出力された HTML が有効であること (つまり、ページが壊れないこと) を確認し、XSS 攻撃を受けていないことを確認することだけを目的とした巨大な " HTML Purifier " フレームワークを見てください。
「HTML をサニタイズするのは間違いなく難しいため、さまざまなマークアップ言語が作成されています。」
本当に?どのように難しいですか?潜在的に危険な属性またはタグを削除し、データベースまたはファイルに入力する前に HTML を検証する機能があります。HTML をサニタイズするのが難しい例を教えてください。