web-dev-qa-db-ja.com

C#を使用してHTMLページの入力をサニタイズする方法

HTMLページへの入力をサニタイズするためのライブラリまたは受け入れ可能な方法はありますか?

この場合、名前、電話番号、メールアドレスのみのフォームがあります。

コードはC#である必要があります。

例えば:

"<script src='bobs.js'>John Doe</script>""John Doe"になるはずです

36
NotMe

HtmlSanitizer .Netライブラリを使用しています。

また、 NuGet

37
Julian

この回答に対して行ったコメントに基づいて、この質問に役立つ情報が見つかる可能性があります。
https://stackoverflow.com/questions/72394/what-should-a-developer-know-before-building-a-public-web-site

パラメータ化されたクエリの例を次に示します。これの代わりに:

string sql = "UPDATE UserRecord SET FirstName='" + txtFirstName.Text + "' WHERE UserID=" + UserID;

これを行う:

SqlCommand cmd = new SqlCommand("UPDATE UserRecord SET FirstName= @FirstName WHERE UserID= @UserID");
cmd.Parameters.Add("@FirstName", SqlDbType.VarChar, 50).Value = txtFirstName.Text;
cmd.Parameters.Add("@UserID", SqlDbType.Integer).Value = UserID;

編集:注射がなかったので、それを扱っている答えの部分を削除しました。基本的なパラメーター化されたクエリの例は残しました。これは、質問を読んでいる他の人にはまだ役立つ可能性があるためです。
-ジョエル

9
Joel Coehoorn

タグを完全に削除することを意味する場合、Bryantによって参照されるRegExの例は、必要なソリューションのタイプです。

コードが設計に影響を与えてユーザーに表示されないようにするだけの場合。これを防ぐためにHttpUtility.HtmlEncodeメソッドを使用できます。

8
Mitchel Sellers

Microsoft Anti-Cross Site Scripting Library の使用についてはどうですか?

7
stian.net

コンテンツを送信するユーザーはいるが、完全に信頼することはできないようですが、それでもユーザーが提供するコンテンツを非常に安全なHTMLとしてレンダリングしたいと考えています。ここでは3つのテクニックを紹介します。HTMLをすべてエンコードするか、HTMLをエンコードして邪魔な部分だけを削除するか、または使いやすいHTMLにコンパイルするDSLを使用します。

  1. 「ジョンドゥ」になればいいの?私は HTMLエンコード その文字列を使用して、ユーザーに "John Doe"(実際にそれが彼の本名なら...)に愚かな見かけの名前<script src='bobs.js'>John Doe</script>を与えます。そもそも、名前をスクリプトタグやその他のタグで囲むべきではありません。これは、他の手法のいずれかに本当に良いビジネスケースがない限り、私がすべてのケースで使用するアプローチです。

  2. ユーザーからHTMLを受け入れ、次に sanitization method @Bryantのようなホワイトリストアプローチを使用して(出力で)サニタイズします。これを正しく行うことは(非常に)困難であり、私はそれをより大きな心に引き延ばすことを延期します。一部のサニタイザは、他の人が問題のあるビットを完全に削除した場合に悪をHTMLエンコードします。

  3. 別のアプローチは、HTMLに「コンパイル」するDSLを使用することです。 whitehat DSLコンパイラを確認してください。一部の( MarkdownSharp など)は<script>タグのような任意のHTMLと、エンコードされていない(これは完璧ですが)悪の属性を許可します。合理的ですが、あなたが必要または期待するものとは異なる場合があります。その場合は、テクニック#2を使用して、コンパイラが出力するものを無害化する必要があります。

締めくくり:

5
Jeremy Cook