15

他のユーザーに表示する予定のユーザー入力テキストにActionView::Helpers::SanitizeHelper#sanitizeを使用できますか? たとえば、このサイトで説明されているすべてのケースを適切に処理できますか?

また、ドキュメントには次のことが記載されています。

ユーザー提供のテキストをサニタイズしても、結果のマークアップが有効である (ドキュメントの種類に準拠している) こと、または整形式であることは保証されないことに注意してください。出力には、エスケープされていない '<'、'>'、'&' などがまだ含まれている可能性があります。ブラウザを混乱させます。

これを処理する最良の方法は何ですか? Hpricot表示する前にサニタイズされたテキストを渡しますか?

4

3 に答える 3

16

Ryan Grove のSanitizeは、Rails 3 よりもはるかに優れていますsanitize。出力 HTML が整形式であり、3 つのホワイトリストが組み込まれていることが保証されます。

Sanitize::Config::RESTRICTED 非常に単純なインライン フォーマット マークアップのみを許可します。リンク、画像、またはブロック要素はありません。

Sanitize::Config::BASIC タグ、リンク、リストの書式設定など、さまざまなマークアップを許可します。画像と表は許可されず、リンクは FTP、HTTP、HTTPS、および mailto プロトコルに制限され、SEO スパムを軽減するためにすべてのリンクに属性が追加されます。

Sanitize::Config::RELAXED画像や表など、BASIC よりもさらに幅広いマークアップを許可します。リンクは依然として FTP、HTTP、HTTPS、および mailto プロトコルに制限されていますが、画像は HTTP および HTTPS に制限されています。このモードでは、 はリンクに追加されません。

于 2011-02-17T17:15:43.510 に答える
11

サニタイズは確かに「h」ヘルパーよりも優れています。すべてをエスケープする代わりに、実際には指定したhtmlタグを許可します。そして、はい、それはミックスからjavascriptを完全に削除するので、クロスサイトスクリプティングを防ぎます。

要するに、両方が仕事を成し遂げるでしょう。平文以外のものを期待しない場合は「h」を使用し、一部を許可する場合、または人々が入力しようとする可能性があると思われる場合はサニタイズを使用します。サニタイズですべてのタグを禁止した場合でも、「h」のようにタグをエスケープするのではなく、削除することでコードを「きれいに」します。

不完全なタグの場合:htmlを含むフィールドをhpricotに渡すモデルで検証を実行できますが、ほとんどのアプリケーションではこれはやり過ぎだと思います。

于 2010-10-27T01:55:34.160 に答える
4

最善の行動方針は、次の 2 つの要素に依存します。

  • Rails のバージョン (2.x または 3.x)
  • ユーザーが入力時に HTMLを入力する必要があるかどうか。

原則として、ユーザーが html を入力することを許可していません。代わりに、テキスタイルを入力できるようにしています。

レール 3.x:

ユーザー入力はデフォルトでサニタイズされます。ユーザーが HTML を送信できるようにする場合を除き、何もする必要はありません。その場合は、読み続けてください。

この railscastは、rails 3 に対する XSS 攻撃を扱います。

レール 2.x:

ユーザーからの html を許可しない場合は、次のhようにメソッドで出力を保護するだけです。

<%= h post.text %>

ユーザーに HTML を送信してもらいたい場合は、Rails のsanitizeメソッドまたはHTML::StathamSanitizerを使用できます。

于 2010-06-07T07:41:09.583 に答える