Μια αίτηση ASP.NET που έχει πολλά κλειδιά φόρμας, αρχεία ή μέλη ωφέλιμου φορτίου JSON αποτυγχάνει με εξαίρεση

Ισχύει για
.NET Framework 3.5 Service Pack 1 Windows 7 Service Pack 1 Windows 7 Enterprise Windows 7 Professional Windows 7 Ultimate Windows 7 Home Premium Windows 7 Home Basic Windows Server 2008 R2 Service Pack 1 Windows Server 2008 R2 Standard Windows Server 2008 R2 Enterprise Windows Server 2008 R2 Datacenter Windows Server 2008 Service Pack 2 Windows Server 2008 for Itanium-Based Systems Windows Server 2008 Datacenter Windows Server 2008 Enterprise Windows Server 2008 Standard Windows Server 2008 Web Edition Windows Vista Service Pack 2 Windows Vista Business Windows Vista Enterprise Windows Vista Home Basic Windows Vista Home Premium Windows Vista Starter Windows Vista Ultimate Windows Vista Enterprise 64-bit Edition Windows Vista Home Basic 64-bit Edition Windows Vista Home Premium 64-bit Edition Windows Vista Ultimate 64-bit Edition Windows Vista Business 64-bit Edition Microsoft Windows Server 2003 Service Pack 2 Microsoft Windows XP Professional x64 Edition Microsoft Windows XP Service Pack 3 Microsoft Windows XP Home Edition Microsoft Windows XP Professional

Σύνοψη

Η ενημέρωση ασφαλείας MS11-100 της Microsoft περιορίζει τον μέγιστο αριθμό κλειδιών φόρμας, αρχείων και μελών JSON σε 1000 σε μια αίτηση HTTP. Εξαιτίας αυτής της αλλαγής, ASP.NET εφαρμογές απορρίπτουν αιτήσεις που έχουν περισσότερα από 1000 από αυτά τα στοιχεία. Τα προγράμματα-πελάτες HTTP που υποβάλλουν τέτοιου είδους αιτήματα θα απορρίπτονται και θα εμφανίζεται ένα μήνυμα σφάλματος στο πρόγραμμα περιήγησης Web. Το μήνυμα σφάλματος θα έχει συνήθως έναν κωδικό κατάστασης HTTP 500. Αυτό το νέο όριο μπορεί να ρυθμιστεί ανά εφαρμογή. Ανατρέξτε στην ενότητα "Προτεινόμενη αντιμετώπιση" για οδηγίες ρύθμισης παραμέτρων.

Συμπτώματα

ASP.NET αιτήσεις που περιέχουν πολλά κλειδιά φόρμας, αρχεία ή ωφέλιμο φορτίο JSON λαμβάνουν απόκριση σφάλματος από τον διακομιστή. Το αρχείο καταγραφής εφαρμογής στο διακομιστή έχει μια καταχώρηση προειδοποίησης με μια προέλευση που είναι μια συγκεκριμένη έκδοση του ASP.NET και ένα αναγνωριστικό συμβάντος 1309. Το αρχείο καταγραφής συμβάντων περιέχει ένα από τα ακόλουθα μηνύματα:

Μήνυμα 1:

Σημείωση

Πληροφορίες εφαρμογής:
Τομέας εφαρμογής: /LM/W3SVC/1/ROOT/<App Domain>
Επίπεδο εμπιστοσύνης: Μεσαίο
Εικονική διαδρομή εφαρμογής: <Διαδρομή VDIR>
Διαδρομή εφαρμογής: <Διαδρομή εφαρμογής>
Όνομα υπολογιστή: <Όνομα μηχανήματος>
Πληροφορίες διαδικασίας:
Αναγνωριστικό διαδικασίας: 0001
Όνομα διαδικασίας: w3wp.exe
Όνομα λογαριασμού: IIS APPPOOL\DefaultAppPool

Πληροφορίες εξαίρεσης:
Τύπος εξαίρεσης: HttpException
Μήνυμα εξαίρεσης: Τα δεδομένα φόρμας με κωδικοποίηση URL δεν είναι έγκυρα.
στο System.Web.HttpRequest.FillInFormCollection()
στο System.Web.HttpRequest.get_Form()
στο System.Web.HttpRequest.get_HasForm()
στο System.Web.UI.Page.GetCollectionBasedOnMethod(Boolean dontReturnNull)
στο System.Web.UI.Page.DeterminePostBackMode ()
στο System.Web.UI.Page.ProcessRequestMain(δυαδική τιμή includeStagesBeforeAsyncPoint, δυαδική τιμή includeStagesAfterAsyncPoint)

Μήνυμα 2:

Σημείωση

Πληροφορίες εφαρμογής:
Τομέας εφαρμογής: /LM/W3SVC/1/ROOT/<App Domain>
Επίπεδο εμπιστοσύνης: Μεσαίο
Εικονική διαδρομή εφαρμογής: <Διαδρομή VDIR>
Διαδρομή εφαρμογής: <Διαδρομή εφαρμογής>
Όνομα υπολογιστή: <Όνομα μηχανήματος>

Πληροφορίες διαδικασίας:
Αναγνωριστικό διαδικασίας: 0001
Όνομα διαδικασίας: w3wp.exe
Όνομα λογαριασμού: IIS APPPOOL\DefaultAppPool

Πληροφορίες εξαίρεσης:
Τύπος εξαίρεσης: InvalidOperationException
Μήνυμα εξαίρεσης: Η λειτουργία δεν είναι έγκυρη εξαιτίας της τρέχουσας κατάστασης του αντικειμένου.
στο System.Web.HttpRequest.FillInFilesCollection()
στο System.Web.HttpRequest.get_Files()
at FileUpload.Page_Load(Αποστολέας αντικειμένου, EventArgs e)
στο System.Web.Util.CalliHelper.EventArgFunctionCaller (IntPtr fp, αντικείμενο o, αντικείμενο t, EventArgs e)
στο System.Web.Util.CalliEventHandlerDelegateProxy.Callback (αποστολέας αντικειμένου, EventArgs e)
στο System.Web.UI.Control.OnLoad(EventArgs e)
στο System.Web.UI.Control.LoadRecursive()
στο System.Web.UI.Page.ProcessRequestMain(δυαδική τιμή includeStagesBeforeAsyncPoint

Μήνυμα 3:

Σημείωση

Πληροφορίες εφαρμογής:
Τομέας εφαρμογής: /LM/W3SVC/1/ROOT/<App Domain>
Επίπεδο εμπιστοσύνης: Μεσαίο
Εικονική διαδρομή εφαρμογής: <Διαδρομή VDIR>
Διαδρομή εφαρμογής: <Διαδρομή εφαρμογής>
Όνομα υπολογιστή: <Όνομα μηχανήματος>

Πληροφορίες διαδικασίας:
Αναγνωριστικό διαδικασίας: 0001
Όνομα διαδικασίας: w3wp.exe
Όνομα λογαριασμού: IIS APPPOOL\DefaultAppPool

Πληροφορίες εξαίρεσης:
Τύπος εξαίρεσης: InvalidOperationException
Μήνυμα εξαίρεσης: Η λειτουργία δεν είναι έγκυρη εξαιτίας της τρέχουσας κατάστασης του αντικειμένου.
στο System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeDictionary(Int32 βάθος)
στο System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 βάθος)
στο System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize (συμβολοσειρά εισόδου, Int32 depthLimit, JavaScriptSerializer serializer)
στο System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(σειριοποίηση JavaScriptSerializer, είσοδος συμβολοσειράς, τύπος τύπου, Int32 depthLimit)
στο System.Web.Script.Serialization.JavaScriptSerializer.DeserializeObject (συμβολοσειρά εισόδου)
at Failing.Page_Load(Αποστολέας αντικειμένου, EventArgs e)
στο System.Web.Util.CalliHelper.EventArgFunctionCaller (IntPtr fp, αντικείμενο o, αντικείμενο t, EventArgs e)
στο System.Web.Util.CalliEventHandlerDelegateProxy.Callback (αποστολέας αντικειμένου, EventArgs e)
στο System.Web.UI.Control.OnLoad(EventArgs e)
στο System.Web.UI.Control.LoadRecursive()
στο System.Web.UI.Page.ProcessRequestMain(δυαδική τιμή includeStagesBeforeAsyncPoint, δυαδική τιμή includeStagesAfterAsyncPoint)

        
Το αρχείο καταγραφής των υπηρεσιών IIS εμφανίζει μια καταχώρηση παρόμοια με την ακόλουθη:

2011-01-01 00:00:00 ::1 POST /machine/default.aspx - 80 - ::1 - 500 0 0 187

Αιτία

Η ενημέρωση ασφαλείας της Microsoft που αντιμετωπίζει το ενημερωτικό δελτίο ασφαλείας MS11-100 αλλάζει τον προεπιλεγμένο μέγιστο αριθμό κλειδιών φόρμας, αρχείων και μελών JSON που θα αποδέχεται ASP.NET σε μια αίτηση σε 1.000. Αυτή η αλλαγή έγινε για να αντιμετωπιστεί το θέμα ευπάθειας άρνησης εξυπηρέτησης που τεκμηριώνει το ενημερωτικό δελτίο ασφαλείας MS11-100 της Microsoft.

Επίλυση

Οι εφαρμογές που φτάνουν αυτό το όριο για κλειδιά φόρμας ή αρχεία μπορούν να τροποποιήσουν το ASP.NET appSetting aspnet:MaxHttpCollectionKeys, όπως φαίνεται παρακάτω στο αρχείο ρύθμισης παραμέτρων μιας εφαρμογής ASP.NET. Αυτή η ρύθμιση αντιμετωπίζει τα μηνύματα σφάλματος 1 και 2 από την ενότητα "Συμπτώματα".

<configuration>
<appSettings>
<add key="aspnet:MaxHttpCollectionKeys" value="1000" />
</appSettings>
</configuration>

        
Σημείωση
Εάν χρησιμοποιείτε ASP.NET 1.1 σε ένα σύστημα που βασίζεται σε x86, η ρύθμιση προσαρμόζεται προσθέτοντας μια τιμή DWORD στο ακόλουθο κλειδί μητρώου:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\1.1.4322.0\MaxHttpCollectionKeys

Εάν χρησιμοποιείτε ASP.NET 1.1 σε ένα σύστημα που βασίζεται σε x64, η ρύθμιση προσαρμόζεται προσθέτοντας μια τιμή DWORD στο ακόλουθο κλειδί μητρώου:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\ASP.NET\1.1.4322.0\MaxHttpCollectionKeys

        
        
Οι εφαρμογές που φτάνουν αυτό το όριο για ωφέλιμα φορτία JSON μπορούν να τροποποιήσουν το ASP.NET appSetting aspnet:MaxJsonDeserializerMembers, όπως φαίνεται παρακάτω στο αρχείο ρύθμισης παραμέτρων μιας εφαρμογής ASP.NET. Αυτή η ρύθμιση αντιμετωπίζει το μήνυμα σφάλματος 3 από την ενότητα "Συμπτώματα".

<configuration>
<appSettings>
<add key="aspnet:MaxJsonDeserializerMembers" value="1000" />
</appSettings>
</configuration>

      

        
Σημείωση Η αύξηση αυτής της τιμής πάνω από την προεπιλεγμένη ρύθμιση αυξάνει την ευαισθησία του διακομιστή σας στην ευπάθεια άρνησης εξυπηρέτησης που περιγράφεται στο ενημερωτικό δελτίο ασφαλείας MS11-100.

Παραπομπές

Για περισσότερες πληροφορίες σχετικά με το ενημερωτικό δελτίο ασφαλείας MS11-100, ανατρέξτε στο ακόλουθο άρθρο του TechNet:

Ασφάλεια της Microsoft Bulletin MS11-100 - κρίσιμη Για περισσότερες πληροφορίες, κάντε κλικ στον αριθμό του άρθρου παρακάτω, για προβολή του άρθρου στη Γνωσιακή Βάση της Microsoft:

2638420 MS11-100: Ένα θέμα ευπάθειας στο .NET Framework θα μπορούσε να επιτρέψει προβιβασμό δικαιωμάτων: 29 Δεκεμβρίου 2011