12

私は受け入れるコントローラを持っています

public class MyModel
{
   [MaxLength(400)]
   public string Message { get; set; }
}

WebApi Post アクションがあります

public HttpResponseMessage Post(MyModel viewModel)
{
            if (!ModelState.IsValid)
                return new HttpResponseMessage(HttpStatusCode.BadRequest);                 
            ...
}

そして取得アクション。

コンテンツはビューに直接ではなく JavaScript によって書き出されるため、正確なコンテンツが書き出され、危険なコンテンツに関する asp.net の警告も発生しませんでした。

XSS から保護したい。現時点で私がやっている

HttpUtility.HtmlEncode(Regex.Replace(p.Message, @"<[^>]*>", String.Empty))

取得アクションで。( C# 正規表現を使用して HTML タグを削除するからいくつかのコードを取得)

Asp.Net に組み込まれている保護機能はありますか? モデルを装飾できる属性はありますか?

このhttp://stephenwalther.com/archive/2012/06/25/announce-the-june-2012-release-of-the-ajax-control-toolkit.aspxに気付きましたが、クリックしてhttp://wpl にアクセスしました。 codeplex.com/ のレビューは非常に悪いようです。

4

5 に答える 5

12

現在のコードでは、ユーザーはスクリプトタグを使用しないJavaScriptを挿入するだけで済みます。

使用される可能性のあるXSSの脆弱性の一般的なリストがあります。

現在、「文字列」を受け入れ、解析するのはHTMLタグだけです。残念ながら、HTMLに依存しないXSS攻撃がたくさんあります。

たとえば、FirefoxのGETリクエストに次を追加すると、%22onmouseover=prompt%28%29//JavaScriptを挿入できるようになります。

最善の策は、MicrosoftのAntiXssライブラリを使用し、GETおよびPOSTリクエストのパラメータを具体的にエンコードすることです。

(私は仕事に向かわなければなりませんが、これを行う方法については後でさらにコードを投稿します)。

于 2012-09-27T12:36:46.983 に答える
7

XSS 攻撃から保護するには、主に 2 つの考え方があります。

  • 出力エンコーディング
  • 入力検証

出力エンコーディングについては、 Server.HtmlEncode(p.message) がトリックを実行する必要があります(したがって、現在例にあるものは機能します。必要がない場合は正規表現の置換を行う必要はありません。出力エンコーディングは防止しますXSS)。ここでは、URL エンコーディングなどではなく、HTML エンコーディングを行いたいと想定しています。

.NET MVC フレームワークを使用しているようです。DataAnnotationsを使用して、ホワイト リストの検証 (安全な文字のみを許可) とブラック リストの検証を実行できます。RegularExpressionAttributeの使用を検討します。例えば:

public class MyModel
{
   [RegularExpression(@"^[a-zA-Z''-'\s]{1,400}$", ErrorMessage = "Characters are not allowed.")]
   public string Message { get; set; }
}

お役に立てれば。

于 2012-10-03T03:04:19.190 に答える
-3

Web のセキュリティ上の欠点から保護するには:

被害軽減に努めます。偽造防止トークンを使用し、特定のアクションに対してのみ SSL を受け入れるようにしてください。Cookie が適切に保護されていることを確認します。全体として、攻撃面を最小限に抑え、障害物を配置して攻撃を困難にします。

ユーザー入力から保護するには:

ユーザー入力をパラメータ化します。パラメータ化やエンコードができない場合でも、エンコードには細心の注意を払ってください。多くのエクスプロイトは、不適切なエンコードが原因で発生しています。エンコーディングは、入力がどこでどのように使用されるかにも依存します。ユーザー入力を制限して検証し、サーバーが入力の特定のドメインのみを受け入れるようにします。前と同じように、入力が使用されるすべての方法を理解してください。

Web サーバーからの応答の処理:

Web サーバーから OK ステータスを取得したことを確認します。そうでない場合は、各応答を適切に処理してください。通常、jquery.ajax では、done、fail、always、および statusCode ですべての応答を処理するオプションが提供されます。これを適切に行う方法については、jquery のドキュメントを参照してください。

あなたがする必要がある3つのこと:

  1. フォームで @Html.AntiforgeryToken() とそれに対応する [ValidateAntiForgeryTokenAttribute] 属性を使用して、クラスやメソッドを装飾します。

  2. ユーザーからの入力を正しく処理します。そのデータに触れるすべての場所で、エンコードまたはパラメーター化、または検証、制約、または変更が必要な場合は、コンテキストを考慮する必要があります。

  3. Web サーバーからの応答を正しく処理します。

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = false, Inherited = true)] public sealed class ValidateAntiForgeryTokenAttribute : FilterAttribute, IAuthorizationFilter { public Task< HttpResponseMessage > ExecuteAuthorizationFilterAsync(HttpActionContext actionContext, CancellationToken cancellationToken, Func< Task< HttpResponseMessage > > continuation) { try { AntiForgery.Validate(); } catch { actionContext.Response = new HttpResponseMessage { StatusCode = HttpStatusCode.Forbidden, RequestMessage = actionContext.ControllerContext.Request }; return FromResult(actionContext.Response); } return continuation(); } private Task< HttpResponseMessage > FromResult(HttpResponseMessage result) { var source = new TaskCompletionSource< HttpResponseMessage >(); source.SetResult(result); return source.Task; } }

于 2014-10-03T00:41:24.190 に答える