3

asp.net mvc (C#) アプリケーションで JavaScript インジェクションを処理するにはどうすればよいですか?

ビューで Html.Encode を使用できます。しかし、問題は、ブログ投稿のようにページに表示する html もあるということです。

アプリケーションの入力要素に入力されたスクリプトを削除する必要がありますか? 共通の場所でそれを行うにはどうすればよいですか?

4

1 に答える 1

9

これを行うための「高レベル」のベスト プラクティスは次のとおりです。

  • システムに入力された方法でユーザー入力を保存する
  • ユーザー入力が任意のページに出力されるときに、すべてのユーザー入力を HTML エンコードします。
  • ホワイトリスト アプローチを使用して、前の手順でエンコードした許可された HTML 文字、属性、属性値などを「逆エンコード」します。

出力時にユーザー入力を HTML エンコーディングすると、サイトで JavaScript が実行されなくなります。

ユーザー入力を「入力したまま」保存する理由は、将来、同じエンコード規則を持たない他の形式 (PDF、電子メール、JavaScript、RSS など) でユーザー データを出力することを決定する可能性があるためです。 . そのため、データをできるだけ元の形式に近づける必要があります。これにより、後で処理が容易になります。

HTML エンコーディングのユーザー入力には、 を使用できますSystem.Web.HttpUtility.HtmlEncode(...)

手順 2 と 3 を組み合わせるには、Microsoft のAntiXSS ライブラリを使用できます。HttpUtility クラスでは提供されない追加のエンコーディング メソッドがいくつか提供されているため、作業が簡単になります。Malcolm がコメントで指摘するまで、このライブラリの最新バージョンには、GetSafeHtmlFragment(...)すべての JavaScript を手動で削除するというメソッドが含まれていることを知りませんでした。これにより、ユーザーが入力した JavaScript コードを削除するという面倒な作業がすべて処理されます。HTML ドキュメント全体をエンコードするように設計されている andではなくGetSafeHtmlFragment、ほとんどの場合、 andを使用することをお勧めし ます。 GetSafeHtml

軽微な注意:機能が期待どおりに動作しない場合は、最新の AntiXss リリース (これを書いている時点で 2012 年 1 月) のレビューを読んでください。必要に応じて古いリリースの使用を検討することもできますが、古いリリースには既知のセキュリティ上の欠陥があることに注意してください。Microsoft はこの問題を認識しており、解決策を検討しています。

于 2010-02-06T06:10:09.060 に答える