2017-08-23 14 views
0

jsonがMVCアクションに投稿された場​​合(JQueryからの$ .ajax投稿など)、MVCからのXSS検出をフィルタから手動で呼び出す方法はありますかjsonコンテンツ)?JSON ajax投稿のMVCアクションからのXSS検証

私たちはMVC 5を使用しており、XSS(潜在的に安全でない入力が検出された)を捕まえるための標準のMVCメカニズムに問題はありませんが、アプリケーションのいくつかは$.ajaxを使用してJSON( "application/json" MVCアクションに変換します。このような状況では、XSSの検出が実行されず、危険なフォーム入力が可能になっています。

デフォルトのモデルバインダー内のJsonValueProviderFactoryは、フォーム送信時またはクエリ文字列からの入力時にこのXSSセキュリティに対して同じ呼び出しを持たないことがわかりました。

クライアント側の入力をサニタイズするのは簡単ですが、5xxをスローするためにサーバーの検証も必要です(影響を受ける可能性のあるアクションを共有するためにフィルタをラップすることも可能です) json上のこの危険なコード検出は、デフォルトモデルバインディングを使用して入力を提出し、可能であれば、ホイールの再発明やhtmlエンコードされた悪い入力をdbに挿入しないようにしました。

答えて

2

私の状況に適した解決策が見つかりました。この場合、JSONをMVCアクションに投稿するために、$.ajaxを使用してJQueryを作成しました。デフォルトのモデルバインダーは、安全なXSSが私たちのアクションに対して掲示されることを可能にするポストされたJSONを検証しません。この問題を解決するには

、私はRequestValidatorは(私が今まで見ていたすべてのソリューションがここにホイールを再発明し、黒/白のリストのための独自のXSSチェックをしたので)XSSを検出するために、特定の文字列を検証する許可静的メソッドInvokeIsValidRequestStringを持っていました。その後、適切なシナリオにアクションを限定し、ポストされたJSONを取得し、XSSが検出された場合に検証エラーをスローするだけでした。

public class ValidateJsonXssAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var request = filterContext.HttpContext?.Request; 
     if (request != null && "application/json".Equals(request.ContentType, StringComparison.OrdinalIgnoreCase)) 
     { 
      if (request.ContentLength > 0 && request.Form.Count == 0) // 
      { 
       if (request.InputStream.Position > 0) 
        request.InputStream.Position = 0; // InputStream has already been read once from "ProcessRequest" 
       using (var reader = new StreamReader(request.InputStream)) 
       { 
        var postedContent = reader.ReadToEnd(); // Get posted JSON content 
        var isValid = RequestValidator.Current.InvokeIsValidRequestString(HttpContext.Current, postedContent, 
         RequestValidationSource.Form, "postedJson", out var failureIndex); // Invoke XSS validation 
        if (!isValid) // Not valid, so throw request validation exception 
         throw new HttpRequestValidationException("Potentially unsafe input detected"); 
       } 
      } 
     } 
    } 
} 

その後、私はちょうど標準のXSS対策をバイパスする可能性があるJSON-ポストされたデータを期待して、関連するMVCアクション飾ることができます。

[HttpPost] 
[ValidateJsonXss] 
public ActionResult PublishRecord(RecordViewModel vm) { ... } 

を私はでそれthet OWASPの.NET勧告につまずくことが幸運でしたRequestValidatorオブジェクトを拡張することを推奨しました。これは、クエリ文字列、フォームコレクション、およびCookie値の他のシナリオでMVCによって自動的に利用されるValidateInputによって行われた文字列の検証を公開します。誰もが他の提案を持っている場合、私は他のアプローチを見てみたいhttps://www.owasp.org/index.php/ASP.NET_Request_Validation

:詳細情報については

関連する問題