2016-08-10 15 views
5

私はNewtonsoft.Jsonをjsonの文字列を逆シリアル化するために使用していますが、私は未検証のjsonを使用していると不平を言っています。私はその後、Newtonsoft.Json.Schemaを使用して、チェックを追加しましたが、それは今でJSON文字列を検証する方法についてさらに.NETのFortify Json注入

var schema = JsonSchema.Parse(JsonConvert.SerializeObject(typeof(T))); 
JToken token = JArray.Parse(json); -- Vulnerability 
IList<string> errors; 
if (token.IsValid(schema, out errors)) 
{ 
    return JsonConvert.DeserializeObject<T>(json); -- Vulnerability 
} 

何かアドバイスを不平を言いますか?

メソッドDeserializeObject()は、 の入力をJSONに書き込みます。この呼び出しは、攻撃者が に任意の要素や属性をJSONエンティティに注入する可能性があります。

+1

は 'complains'を定義するのに役立ちますです。例外またはエラーメッセージがありますか? – Igor

+4

[これがどのように動くのか、私はFortifyをオフにして移動する](http://i.stack.imgur.com/K0v6i.png) – Will

+0

Fortifyによって生成された正確なエラーメッセージで質問を更新してください – oldbam

答えて

6

私は後半の対応のために謝罪し、私はそれを修正/欺くことができました。ここでは修正

byte[] jsonBytes = Encoding.UTF8.GetBytes(json); 
using (var stream = new MemoryStream(jsonBytes)) 
{ 
    output = Deserialize<List<T>>(stream); 
} 

public TResult Deserialize<TResult>(Stream responseStream) 
    { 
     using (var sr = new StreamReader(responseStream)) 
     { 
      using (var reader = new JsonTextReader(sr)) 
      { 
       var serializer = new JsonSerializer 
       { 
        MissingMemberHandling = 
         EnforceMissingMemberHandling ? MissingMemberHandling.Error : MissingMemberHandling.Ignore, 
        NullValueHandling = IgnoreNullValues ? NullValueHandling.Ignore : NullValueHandling.Include 
       }; 

       return serializer.Deserialize<TResult>(reader); 
      } 
     } 
    } 

希望はこれが誰か

+0

説明のビットがいいです。 – shmosel

3

それはあなたのケースではFortifyはあなたが信頼できないソースからjsonを使用すると文句を言いよう、これはFortify documentationに言われているものであるになります

アプリケーション構造場合はJSON文書やメッセージの意味は変更することができます未確認入力からのJSON。比較的重大なケースでは、攻撃者は、JSON文書や要求を解析中にアプリケーションが例外をスローするような無関係な要素を挿入する可能性があります。 JSONインジェクションを含むより深刻なケースでは、攻撃者はJSONドキュメントまたはリクエスト内のビジネスクリティカルな値の予測可能な操作を可能にする無関係な要素を挿入する可能性があります。

あなたが所有するWebサービスからjsonを受け取った場合、おそらくFortifyの警告を無視できます。しかし、入力上でJArray.Parse()を呼び出すことは有効な配列であると推測しますが、そうでない場合はJsonReaderExceptionとなります。また、実際にスキーマに対してJSONを検証していないので、JSON.NET exampleを参照してJSONスキーマの指定方法を確認してください。

正直言って、FortifyがサードパーティのWebサービスから受け取ったJSONをどのように検証するのか、自分自身に気づくことができます。

関連する問題