11

Ok, so I have been reading about markdown here on SO and elsewhere and the steps between user-input and the db are usually given as

  1. convert markdown to html
  2. sanitize html (w/whitelist)
  3. insert into database

but to me it makes more sense to do the following:

  1. sanitize markdown (remove all tags - no exceptions)
  2. convert to html
  3. insert into database

Am I missing something? This seems to me to be pretty nearly xss-proof

4

5 に答える 5

23

このリンクを参照してください:

http://michelf.com/weblog/2010/markdown-and-xss/

> hello <a name="n"
> href="javascript:alert('xss')">*you*</a>

なる

<blockquote>
 <p>hello <a name="n"
 href="javascript:alert('xss')"><em>you</em></a></p>
</blockquote>

∴ HTMLに変換した、サニタイズする必要があります。

于 2011-07-25T22:55:50.280 に答える
6

あなたが提案したことには2つの問題があります:

  1. ユーザーが投稿をフォーマットできる方法がわかりません。たとえば、Markdown を利用して、適切な番号付きリストを提供しました。提案されたタグなし例外なしの世界では、エンドユーザーがそのようなことをどのように行うことができるかわかりません。
  2. さらに重要なこと: Markdown を「ネイティブ」フォーマット言語として使用し、他の利用可能なタグをホワイトリストに登録すると、世界の入力側だけでなく、出力も制限されます。言い換えれば、表示エンジンが Markdown を期待し、ホワイトリストに登録されたコンテンツのみを許可する場合、誰かがデータベースにアクセスし、マルウェアを含む厄介なコードを一連の投稿に挿入したとしても、実際のサイトとそのユーザーは保護されます。展示時にも消毒しているためです。

出力のサニタイズに関する Web 上の優れたリソースがいくつかあります。

于 2009-11-06T21:40:27.283 に答える
2
  1. データベースに挿入
  2. マークダウンをhtmlに変換
  3. html のサニタイズ (ホワイトリスト付き)

パール

use Text::Markdown ();
use HTML::StripScripts::Parser ();

my $hss = HTML::StripScripts::Parser->new(
   {
       Context         => 'Document',
       AllowSrc        => 0,
       AllowHref       => 1,
       AllowRelURL     => 1,
       AllowMailto     => 1,
       EscapeFiltered  => 1,
   },
   strict_comment => 1,
   strict_names   => 1,
);

$hss->filter_html(Text::Markdown::markdown(shift))
于 2011-08-03T05:48:50.180 に答える
1
  1. マークダウンをhtmlに変換
  2. html のサニタイズ (ホワイトリスト付き)
  3. データベースに挿入

ここで、仮定は

  1. 危険な HTML が与えられた場合、サニタイザーは安全な HTML を生成できます。
  2. 安全な HTML の定義は変わらないので、DB に挿入しても安全であれば、抽出しても安全です。
  1. マークダウンのサニタイズ (すべてのタグを削除 - 例外なし)
  2. htmlに変換
  3. データベースに挿入

ここでの仮定は

  1. 危険なマークダウンが与えられた場合、サニタイザーは、別のプログラムによって HTML に変換されたときに安全なマークダウンを生成できます。
  2. 安全な HTML の定義は変わらないので、DB に挿入しても安全であれば、抽出しても安全です。

マークダウン サニタイザーは、危険な HTML と危険なマークダウンについてだけでなく、マークダウンから HTML へのコンバーターがどのように機能するかを知る必要があります。これにより、上記の単純な unsafeHTML->safeHTML 関数よりも複雑になり、間違っている可能性が高くなります。

具体的な例として、「すべてのタグを削除する」は、タグを識別できることを前提としており、UTF-7 攻撃に対しては機能しません。この仮定を無意味にする他のエンコーディング攻撃が存在する可能性があります。または、markdown->HTML プログラムが (全角の '<'、マークダウンによって取り除かれたエキゾチックな空白文字、SCRIPT) を次のように変換するバグがある可能性があります。<script>タグ。

最も安全なのは次のとおりです。

  1. マークダウンのサニタイズ (すべてのタグを削除 - 例外なし)
  2. マークダウンを HTML に変換する
  3. HTMLをサニタイズする
  4. 危険とマークされた DB 列に挿入します
  5. DBからその列をフェッチするたびにHTMLを再サニタイズします

そうすれば、HTML サニタイザーを更新すると、新たに発見された攻撃から保護されます。これは多くの場合非効率的ですが、HTML が挿入されたタイムスタンプを保存することで、かなり優れたセキュリティを得ることができます。これにより、サニタイザーを通過する攻撃について誰かが知っていたときに挿入された可能性のあるものを知ることができます。

于 2012-02-10T03:22:40.083 に答える