2009-05-07 10 views
27

WCFサービスが応答メッセージにバイト配列を返した場合、データが既定の長さ16384バイトを超える可能性があります。これが発生すると、例外がXML データを読みながら を超えた最大配列長クォータ(16384)WCF readerクォータ設定 - 欠点?

ようなものであろう。この制限はXML リーダーの作成時に使用される XmlDictionaryReaderQuotas オブジェクトのMaxArrayLengthプロパティを変更することによって を増やすことができます。

私は、ウェブ上で見てきたすべてのアドバイスはちょうど彼らの最大<readerQuotas>要素の設定を大きくすることであるので、サーバ上の

<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" 
       maxArrayLength="2147483647" maxBytesPerRead="2147483647" 
       maxNameTableCharCount="2147483647" /> 

のようなもの、およびクライアント上で同様。

特に、バイト配列のサイズが時折非常に大きくなる可能性がある場合は、このアプローチの欠点を知りたいと思います。上記の設定を行うだけで、WCFはリクエストごとに大きな配列を宣言しますか?返されるデータの最大サイズを制限する必要がありますか、または合理的なサイズのバッファを指定するだけで、すべてのデータが読み込まれるまでWCFが継続しますか?

ありがとうございます!

答えて

33

主な欠点は、攻撃に対する潜在的な脆弱性です。悪意のあるソースは、最大2 GBのメッセージをWebサーバーに流すことができます。

もちろん、2 GBのメッセージを許可すると、メッセージをメモリに完全に組み込む必要があるため、メモリ消費の面でサーバーに負荷がかかります(WCFでストリーミングプロトコルを使用しない限り)。 2つのメッセージを送信するクライアントが10人いる場合は、サーバーに十分なRAMが必要です。 :-)

それ以外は、実際の問題はありません。

マルク・

+0

オクラホマので、サーバ設定の設定だけで、クライアントの設定のリクエストメッセージ、および設定は、応答メッセージに影響を与える影響しますか?小さなリクエストメッセージを受け取るが大きなレスポンスを返すサービスがある場合は、サーバーの設定を変更する必要がありますか、それともクライアントに任せますか?クライアントがサービス参照を作成したときに自動的に大きな応答が設定されるように、サーバー設定を変更する方法はありますか?ありがとう! –

+0

「大きなレスポンス」はどのように構造化されていますか?それは基本的にあなたが返すファイルですか?もしそうなら、私はストリームベースの応答のためにストリーミングをチェックアウトします。私が理解している限り、サーバーの設定は着信要求と発信応答の両方に影響します。したがって、メッセージサイズが小さすぎると大きな応答は不可能です(基本的にはバッファのサイズを設定しています要求と応答に使用されるサーバー上)。 –

8

あなたはこれらの値を設定するときに考える必要があり、様々なセキュリティ上の考慮事項について説明してMSDNの記事があります。サービス拒否攻撃の中には、あなたのメモリを使い果たしてしまうものや、MaxDepthが適切に設定されていないなど、その一部が致命的なStackOverflowExceptionsを引き起こす可能性があります。

http://msdn.microsoft.com/en-us/library/ms733135.aspx

関連する問題