7

ユーザーはアプリケーションで「記事」を編集できます。各記事は DB でマスターされ、Markdown としてクライアントに送信されます。Javascript を使用してクライアント側の HTML に変換します。

これを行っているのは、ユーザーが記事を編集したいときに、マークダウンを編集してサーバーに直接 POST できるようにするためです (既にページにあるため)。

私の質問は、クライアントに送信する Markdown をサニタイズする方法です。Rails のsanitizeヘルパーをそのまま使用できますか?

また、一般的にこのアプローチについて何か考えはありますか? 私が考えたもう 1 つの戦略は、サーバー上で HTML をレンダリングしてサニタイズし、ユーザーが記事を編集したい場合にのみ Markdown をクライアントにプルすることでした。

4

3 に答える 3

4

ここでの他の回答は良いですが、サニタイズについていくつか提案させてください. Rails の組み込みのサニタイザーはまともですが、問題の半分になる傾向がある整形式を保証するものではありません。また、ベストオブブリードではなく、ハッカーが攻撃するための大きなインストールフットプリントがあるため、悪用される可能性もかなりあります.

html5lib はブラウザーと同じように解析するように記述されており、この分野の多くのリーダーによる共同作業であるため、現在最も優れた最も先進的なサニタイズは html5lib であると私は信じています。ただし、これは少し遅く、Ruby にはあまり似ていません。

Ruby では、html5 のサニタイズ機能の一部を逐語的に持ち上げるLoofahをお勧めしますが、Nokogiri を使用してはるかに高速に実行するか、堅牢なテスト スイートと非常に優れた構成可能性を備えたSanitizeをお勧めします (ただし、自分自身を撃たないでください)。

ActsAsSanitiledというプラグインをリリースしました。これは、ActsAsTextiled を書き直したもので、Sanitize gem を使用してテキスタイル出力を自動的にサニタイズします。両方の長所を活かすように設計されています。DB では入力は変更されませんが、フィールドは常に安全な HTML を出力し、テンプレートに何も記憶する必要はありません。私自身は Markdown を使用していませんが、BlueCloth のサポートを追加することを検討します。

于 2009-10-15T07:00:27.147 に答える
4

私はいくつかの原則に従います。

  • ユーザーが入力したものを保存する
  • ディスプレイ上で消毒する
  • 必要なデータだけを送信する

それはあなたが提案する代替アーキテクチャに私を導きます:

  • マークダウンをデータベースに保存する
  • レンダリング時、マークダウン/サニタイズ、HTML をブラウザに送信
  • ユーザーが「編集」を選択した場合 (および選択した場合)、AJAX を介してサーバーから生のマークダウンを要求します。
  • 編集中に「プレビュー」ビューがある場合は、サーバーを使用してこれもレンダリングしようとします (ただし、速度が遅すぎる場合は、このステップを削除する必要がある場合があります)。ただし、プレビュー中は、サニタイズはそれほど重要ではない場合があります。

これが私のアプローチであり、かなりきれいに機能します。

于 2009-09-07T04:10:29.930 に答える
0

私は Rails で Markdown を使用したことはありませんが、提出された Markdown を受け取り、HTML でレンダリングされてサニタイズされたコピーと同様に、データベースに保存するというのが私のアプローチです。そうすれば、サニタイズで情報を捨てることがなくなり、記事を表示するたびに Markdown を再レンダリングする必要がなくなります。

Rails のサニタイズ ヘルパーがその役割を果たします。サニタイズを忘れないようにするために、出力をホワイトリストに登録するために使用できるプラグイン (xss_shield や xss_terminate など) もいくつかあります。

于 2009-09-06T03:41:57.363 に答える