43395


C# ASP.NETでJsonをシリアライズ、または逆シリアライズするときのデフォルト値が1024000であることを最近知りました。

もちろん、このサイズをより大きい値に変更することで大きいjsonを扱うことができるのもわかりました。

しかし、なぜ1024000なのかを知りたいです。  
セキュリティ的な観点での理由なのでしょうか。

いろいろと調べたのですが、どこにも書いていなかったので、この場でご教授いただけたらと思います。  
よろしくお願いします。


CC BY-SA 3.0
2018-04-19T12:13:40.897
43387
2018-04-19T14:50:55.283
12388
question
c# json asp.net
ASP.NETのJSONのサイズがデフォルトで1024000である理由。


まず、ASP.NETにおけるJSONの最大長は`1024000`ではなく[`2097152`](https://msdn.microsoft.com/ja-
jp/library/system.web.script.serialization.javascriptserializer.maxjsonlength\(v=vs.100\).aspx)
(=`2M`)文字です。

なぜ`2M`文字というと、ASP.NETの標準設定ではリクエストのサイズを4MBに制限しているからです。.NETの内部文字コードはUTF-16ですので、4MBは`2M`文字に相当します。

4MB制限自体は異常なデータを送信された場合、いわゆるDoS攻撃の対策として設定されているものです。


CC BY-SA 3.0
2018-04-19T14:09:23.200
43395
2018-04-19T14:09:23.200
5750
43387
answer


回答はpgrhoさんの通りです。  
ご質問の「大きなJSON」というキーワードから、一緒に覚えておくべき物があるのでご紹介です。

[MS11-100](https://docs.microsoft.com/ja-jp/security-
updates/securitybulletins/2011/ms11-100)というセキュリティ更新で、`aspnet:MaxHttpCollectionKeys`と`aspnet:MaxJsonDeserializerMembers`という値が[セキュリティ対策](https://support.microsoft.com/ja-
jp/help/2661403/an-asp-net-request-that-has-lots-of-form-keys-files-or-json-
payload-me)として追加されました。それぞれデフォルト値は`1,000`です。  
`aspnet:MaxJsonDeserializerMembers`により、JSON内のキー・値のペアが`1,000`個を超えるとリクエストを拒否するものです。巨大なJSONをPOSTするようなアプリケーションでは割りと遭遇してしまう値です。

さらに余談ですが、当時「ハッシュテーブルの衝突でDoS」は[様々なプラットフォームで発生](https://scan.netsecurity.ne.jp/article/2012/01/18/28135.html)する凄い発見でした。


CC BY-SA 3.0
2018-04-19T14:50:55.283
43403
2018-04-19T14:50:55.283
2238
43387
answer