26


19

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

HTMLページへの入力をサニタイズするためのライブラリまたは許容できる方法はありますか?

この場合、私は名前、電話番号、そしてEメールアドレスだけのフォームを持っています。

コードはC#でなければなりません。

例えば:

"

「ジョン・ドウ」になるはずです

6 Answer


20


これは古いですが、それでも関連性のある質問です。

 https://github.com/mganss/HtmlSanitizer[HtmlSanitizer]を使用しています。
.Net library, which:


9


あなたがこの答えにしたコメントに基づいて、あなたはこの質問にいくつかの役に立つ情報を見つけるかもしれません:https://stackoverflow.com/questions/72394/what-should-a-developer-know-before-building-a-public-ウェブサイト

これがパラメータ化されたクエリの例です。 これの代わりに:

string sql = "UPDATE UserRecord SET FirstName = '" txtFirstName.Text "' WHERE UserID ="ユーザーID。

これを行う:

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;

'' '' '

編集:注射がなかったので、私はそれに対処する答えの部分を削除しました。 私は基本的なパラメータ化されたクエリの例を残しました、それはまだ質問を読む他の誰にとっても役に立つかもしれないので。 - ジョエル


8


サニタイズすることによってタグを完全に削除することを意味する場合、Bryantによって参照されるRegExの例はあなたが望む解決策のタイプです。

あなたのコードがあなたのデザインを混乱させてユーザーにレンダリングしないことを確実にしたいだけなら。 それを防ぐためにHttpUtility.HtmlEncodeメソッドを使うことができます。


7


http://msdn.microsoft.com/en-us/security/aa973814[Microsoft Anti-Cross Site Scripting Library]の使用はどうですか?


4


コンテンツを送信するユーザーがいるが、それらを完全に信頼することはできませんが、それでも、彼らが提供するコンテンツを超安全なHTMLとしてレンダリングすることを望みます。 これには3つのテクニックがあります。HTMLはすべてをエンコードし、HTMLは悪の部分だけをエンコードおよび/または削除します。あるいは、あなたが使いやすいHTMLにコンパイルするDSLを使用します。

それは "John Doe"になるはずですか? その文字列をhttp://msdn.microsoft.com/ja-jp/library/vstudio/system.web.httputility.htmlencode%28v=vs.110%29.aspx[HTMLエンコード]してユーザーに許可します。 Doe "(もしそれが彼の本当の名前であるなら…​)、ばかげて見える名前を持っている

  1. 彼は自分の名前をスクリプトタグや 最初の場所。 他のテクニックの1つについて本当に良いビジネスケースがない限り、これは私がすべてのケースで使用するアプローチです。

ユーザーからのHTMLを受け入れ、http://web.archive.org/web/20120606051450/http://refactormycode.com/codes/333-sanitize-html[sanitizationのようなホワイトリストアプローチを使用してHTMLをサニタイズしてから(出力時に)サニタイズします方法] @ブライアントは述べた。 これを正しく行うのは(極めて)困難であり、私はそれをより大きな心に委ねるのを遅らせる。 他の人が問題のある部分を完全に削除したであろうところで、一部の消毒剤が悪をHTMLエンコードすることに注意してください。

もう1つの方法は、HTMLに「コンパイル」するDSLを使用することです。 (http://code.google.com/p/markdownsharp/[MarkdownSharp]のような)いくつかは `のような任意のHTMLを許可するのでhttp://en.wikipedia.org/wiki/Whitehat[whitehat]あなたのDSLコンパイラを忘れないでください。 `

</code>タグや悪質な属性はエンコードされていません(ちなみにこれは完全に合理的ですが、<em> </em>が必要または期待するものではないかもしれません)。 その場合は、#2のテクニックを使用し、コンパイラが出力する内容をサニタイズする必要があります。</p> </li> </ol> <p>最後の考え:</p> <ul> <li> #2や#3のテクニックでは、リスクを減らし、労力と心配を省くことができます。テクニック#1を使用してください。</li> <li> DSL たとえば、Markdownの元々の実装では、HTMLをエンコードすることなく使用できます。 <a href="http://daringfireball.net/projects/markdown/syntax" rel="nofollow"> "Markdownの構文でカバーされていないマークアップには、単にHTML自体を使用します。 マークダウンからHTMLに切り替えていることを示すために、その前に接頭辞を付けたり区切ったりする必要はありません。タグを使用するだけです。 "</a> </li> <li>出力時にエンコードします。 入力をエンコードすることもできますが、そうすることでバインドすることができます。 誤ってエンコードして保存した場合、誤ったエンコーダを修正した後で元の入力を元に戻して再エンコードできるようになりますか。</li> </ul>


-5


あなたはhttp://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex.aspx[RegEx]クラスとこのような `<(。| \ n)*?>`のパターンを探しています。 。

あなたがすることができますhttp://blogs.msdn.com/ericgu/archive/2005/11/23/496274.aspx[find] examlesの.html [lot] html [google]