12

Web ベースのアプリケーションを開発していて、リッチ フォーマットのテキストをユーザーに許可したい場合、その入力を許可する方法を選択する必要があります。HTML のサニタイズは間違いなく難しいため、さまざまなマークアップ言語が作成されています。

次のようなさまざまなマークアップ言語の長所と短所は何ですか。

別の言い方をすれば、特定のマークアップ言語を使用する際にどのような要因を考慮しますか。

4

4 に答える 4

10

Markdown、BBCode、Textile、MediaWiki マークアップはすべて基本的に同じ概念なので、HTML とプレーン テキスト マークアップの 2 つのカテゴリに分類します。

HTML

HTML との取引は、コンテンツが既に Web コンテンツの「提示可能な」形式になっているということです。これは素晴らしいことであり、処理時間を節約し、容易に解析できる言語です。HTML コンテンツを処理したり、HTML から他のフォーマットに変換したり、HTML から他のフォーマットに変換したりするための、ほぼすべての言語のライブラリが多数あります。ユーザーから HTML を受け入れるとき、常に正気の入力に依存しているわけではありません。指摘したように、HTML の整頓またはサタンタイズは、特に XML のように通常のマークアップ規則に従わないため (つまり、不適切に閉じられたタグが一般的)、非常に困難な場合がよくあります。

プレーン テキスト マークアップ

このカテゴリは、次の理由で頻繁に使用されます。

  • 1 つのソースから複数のフォームに簡単に解析 - PDF、HTML、RTF
  • コンテンツは、HTML から抽出する必要がなく、後日必要になった場合に、読み取り可能なプレーン テキスト (通常は生の HTML よりもはるかに読みやすい) で保存されます。
  • HTML が煩わしい変数や構造化されていない可能性がある特定の定義済みルールに従います
  • 単純に完全な HTML を許可するよりも、多くの場合により適切なコンテンツ フォーマットのサブセットを強制できます。
  • HTML のサブセットを強制することに加えて、入力のサニタイズが容易になり、クロスサイト スクリプティングの問題などを防ぐことができます。
  • 「生」データを抽象化された形式で保持するということは、後日、たとえばサイトを HTML 4 から XHTML に変換したい場合、解析コードを変更するだけで済みます。HTML 形式のユーザー入力では、すべての HTML を XHTML に個別に変換する必要があり、HTML Tidy が示すように、これは必ずしも簡単な作業ではありません。同様に、新しいマークアップ言語がある時点で登場したり、別の形式 (RTF、PDF、TeX) に移行する必要がある場合は、テキスト形式オプションの抽象化された制限付きサブセットを使用すると、作業がはるかに簡単になります。

結論は、ユーザー入力が使用されているものです。データを保持する予定があり、形式をシャッフルする必要がある場合などは、注意深い抽象形式を使用して情報を保存することをお勧めします。なんらかの理由で生データを手動で操作する必要がある場合、その形式が人間が簡単に読み取れる場合はボーナス ポイントです。コンテンツを Web ページ (またはレポートなどの HTML ドキュメント) に表示するだけで、コンテンツの変換や将来の保証について懸念がない場合は、コンテンツを HTML に保存することをお勧めします。

于 2008-12-05T05:25:44.637 に答える
5

Jeffは、SO をまとめる初期段階にある間に、codinghorror.com でいくつかの長所と短所について議論しました。読みごたえのある作品だと思いました。

于 2008-12-05T05:34:04.043 に答える
0

@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 " フレームワークを見てください。

于 2013-07-14T14:45:18.077 に答える
-1

「HTML をサニタイズするのは間違いなく難しいため、さまざまなマークアップ言語が作成されています。」

本当に?どのように難しいですか?潜在的に危険な属性またはタグを削除し、データベースまたはファイルに入力する前に HTML を検証する機能があります。HTML をサニタイズするのが難しい例を教えてください。

于 2010-10-21T18:15:26.783 に答える