2009-09-06 7 views
6

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

これは、ユーザーが記事を編集したいときに編集可能で、Markdownをサーバーに戻すことができるようにしています(すでにページ上にあるため)。

私の質問は、私がクライアントに送るMarkdownを浄化する方法です。Railsのsanitizeヘルパーを使用することはできますか?

また、このアプローチの一般的な考え方は?私が考えていた別の戦略は、サーバー上のHTMLをレンダリングして消毒し、ユーザーが記事を編集したい場合にのみMarkdownをクライアントに引き出すことでした。

答えて

4

私はカップルのプリンシパルに従ってください:ユーザーの種類

  • が表示
  • にサニタイズ何

    • 店は、あなたが代替アーキテクチャに私を導くことが

  • 必要なデータを送信します提案:

    • st 、描画マークダウン/サニタイズ、ユーザーが「編集」を選択した場合(および場合)、ブラウザ
    • にHTMLを送って、私が持っている場合はAJAX
    • を介してサーバからの生の値下げを要求上のデータベース
    • 鉱石値下げ編集中の「プレビュー」ビューでは、サーバーを使ってこれをレンダリングしようとします(遅すぎるとこの手順を削除する必要があります)。しかしプレビュー中には、サニタイズはそれほど重要ではないかもしれません。

    これは私のアプローチであり、きれいに動作します。

    0

    私はMarkdown in Railsを使用していませんが、提出されたMarkdownをHTMLのレンダリングおよびサニタイズされたコピーと共にデ​​ータベースに保存する方法があります。そうすれば、あなたの墨塗りに何か情報を捨てることはなく、記事を表示するたびにMarkdownを再レンダリングする必要はありません。

    Railsのsanitizeヘルパーがこの作業を行う必要があります。また、あなたの出力をホワイトリストにするために使用できる多くのプラグイン(xss_shieldやxss_terminateなど)があります。ちょうどあなたがサニタイズするのを忘れないようにしてください!

    +0

    ユーザーが記事の「編集」をクリックすると、AJAX経由でサーバーからMarkdownソースをダウンロードできますか? –

    +0

    そうです。さもなければあなたのMarkdown - > sanitized HTML - > Markdown変換で、あなたは失ってはいけないデータを失っているかもしれません。 – nfm

    +0

    サニタイズされたHTMLを保存する理由断片化キャッシュを簡単に使用し、マークダウンの変更時にキャッシュを期限切れにすることもできます。 –

    4

    他の回答は良いですが、私は墨塗りに関するいくつかの提案をしましょう。 Railsビルトインのサニタイザはまともですが、問題の半分になりがちな整形式を保証するものではありません。また、ベスト・オブ・ブリードではなく、ハッカーが攻撃するための大きなインストールフットプリントがあるため、悪用される可能性もかなりあります。

    私は、ブラウザのように解析するように書かれており、現場の多くの指導者が協力しているため、今日の最高の将来的な衛生状態はhtml5libだと信じています。しかし、それは遅い側にビットと非常にルビーのように少しです。Rubyで

    私はHTML5のサニタイズのもののいくつかの逐語的なリフトが、鋸山を使用して、はるかに高速くらい走るまたは固体テストスイートと非常に優れた構成可能性を持っている Sanitizeいずれか Loofahをお勧めします(ただし足で自分自身を撮影しません)。

    ちょうどActsAsSanitiledというプラグインをリリースしました。このプラグインは、Sanitize gemを使用して自動的にテクスチャ化された出力をサニタイズするActsAsTextiledの書き換えです。 DBの入力はそのままですが、フィールドは常にテンプレート内の何かを覚える必要なしに安全なHTMLを出力します。私はMarkdownを自分で使用しませんが、BlueClothのサポートを追加することを検討します。

    +0

    ありがとうございます。 Markdownをサポートすることになった場合、RDiscountはBlueClothよりはるかに優れています(より速く、 "Smarty"をサポートしています) –

    関連する問題