Σύνοψη
Η ενημέρωση ασφαλείας 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