ASP.NET MS11-100: मैं पोस्ट फॉर्म के मूल्यों की अधिकतम संख्या पर सीमा कैसे बदल सकता हूं?


196

Microsoft ने हाल ही में (12-29-2011) .NET .NET फ्रेमवर्क में कई गंभीर सुरक्षा कमजोरियों को दूर करने के लिए एक अपडेट जारी किया। MS11-100 द्वारा शुरू किए गए सुधारों में से एक हैश टेबल टकराव से जुड़े संभावित DoS हमले को अस्थायी रूप से कम कर देता है। ऐसा लगता है कि यह फिक्स पेज टूट गया है जिसमें बहुत सारे POST डेटा हैं। हमारे मामले में, उन पृष्ठों पर, जिनमें बहुत बड़ी चेकबॉक्स सूचियाँ हैं। ऐसा क्यों होगा?

कुछ गैर-आधिकारिक स्रोतों से प्रतीत होता है कि MS11-100 पोस्टबैक आइटम पर 500 की सीमा रखता है। मुझे ऐसा Microsoft स्रोत नहीं मिल रहा है जो इसकी पुष्टि करता हो। मुझे पता है कि व्यू स्टेट और अन्य फ्रेमवर्क सुविधाएँ इस सीमा तक कुछ खा जाती हैं। क्या कोई कॉन्फ़िगरेशन सेटिंग है जो इस नई सीमा को नियंत्रित करती है? हम चेकबॉक्स का उपयोग करने से दूर जा सकते हैं, लेकिन यह हमारी विशेष स्थिति के लिए अच्छी तरह से काम करता है। हम पैच को लागू करना भी पसंद करेंगे क्योंकि यह कुछ अन्य खराब चीजों से बचाता है।

500 सीमा पर चर्चा करने वाले अनौपचारिक स्रोत:

बुलेटिन एक HTTP POST अनुरोध के लिए प्रस्तुत किए जा सकने वाले चरों की संख्या को एक सीमा प्रदान करके DOS अटैक वेक्टर को ठीक करता है। डिफ़ॉल्ट सीमा 500 है जो सामान्य वेब अनुप्रयोगों के लिए पर्याप्त होनी चाहिए, लेकिन जर्मनी में सुरक्षा शोधकर्ताओं द्वारा वर्णित हमले को बेअसर करने के लिए अभी भी काफी कम है।

EDIT: सीमा के उदाहरण के साथ स्रोत कोड (जो 1,000 नहीं, 500 प्रतीत होता है) एक मानक MVC ऐप बनाएं और निम्नलिखित कोड को मुख्य सूचकांक दृश्य में जोड़ें:

@using (Html.BeginForm()) 
{
    <fieldset class="fields">
        <p class="submit">
            <input type="submit" value="Submit" />
        </p>

        @for (var i = 0; i < 1000; i++)
        {
            <div> @Html.CheckBox("cb" + i.ToString(), true) </div>
        } 
    </fieldset>
}

इस कोड ने पैच से पहले काम किया। यह काम नहीं करता है। त्रुटि है:

[InvalidOperationException: ऑपरेशन वस्तु की वर्तमान स्थिति के लिए वैध कारण नहीं है।]
System.Web.HttpValueCollection.ThrowIfMaxHttpCollectionKeysExceeded () +82 System.Web.HttpValueCollection.FillFromEncodedBytes (बाइट [] बाइट्स, एन्कोडिंग एन्कोडिंग) 111
System.Web। HttpRequest.FillInFormCollection () +307


कैसे कुछ अतिरिक्त लेगवर्क करने के बारे में और उस अनुभाग को पोस्ट करें जहां वह विशेष रूप से 500 कहता है।
OO

3
कि बात है। कोई खंड (Microsoft से) नहीं है। बस अनौपचारिक टिप्पणीकारों से जो वे बात कर रहे हैं या नहीं जान सकते हैं। मैंने वैसे भी एक लिंक और स्निपेट पोस्ट किया था।
कोलाइज़ियम

1
@ और: केवल "मल्टी सिलेक्ट लिस्ट" जिसके बारे में मैं सोच सकता हूं कि कई लोगों के लिए सेटमोड के साथ लिस्टबॉक्स होगा। यह वास्तव में संभवतः कई मूल्यों को पोस्ट कर सकता है। हालांकि, प्रश्न में "ड्रॉपडाउन सूचियों" का उल्लेख है। आइए फिर प्रश्न लेखक की किसी भी टिप्पणी की प्रतीक्षा करें।
विकटोर ज़िकला

1
इस विषय पर हाल के एक प्रश्न ने निर्धारित किया कि फिक्स ने पदों की संख्या को सीमित करके डीओएस को कम कर दिया।
जॉन सॉन्डर्स

1
इस पर जानकारी के लिए support.microsoft.com/kb/2661403 देखें ।

जवाबों:


275

इस सेटिंग को web.config में जोड़ने का प्रयास करें। मैं सिर्फ एक asp.net MVC 2 परियोजना के साथ .NET 4.0 पर यह परीक्षण किया है और इस सेटिंग के साथ आपके कोड को फेंक नहीं है:

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

सीमा बदलने के लिए अब आपको (सुरक्षा अद्यतन लागू करने के बाद) काम करना चाहिए।


मैंने अभी तक अपनी मशीन अपडेट नहीं की थी, इसलिए रिफ्लेक्टर का उपयोग करते हुए मैंने HttpValueCollection क्लास की जाँच की, और इसमें यह ThrowIfMaxHttpCollectionKeysExceededविधि नहीं थी :

यहां छवि विवरण दर्ज करें

मैंने KB2656351 (.NET 4.0 के लिए अद्यतन) स्थापित किया , रिफ्लेक्टर में असेंबलियों को फिर से लोड किया और विधि दिखाई दी:

यहां छवि विवरण दर्ज करें

तो वह तरीका निश्चित ही नया है। मैं इस्तेमाल किया जुदा परावर्तक में विकल्प, और मैं क्या कोड से बता सकते हैं से यह एक AppSetting की जाँच करता है:

if (this.Count >= AppSettings.MaxHttpCollectionKeys)
{
  throw new InvalidOperationException();
}

यदि यह web.config फ़ाइल में मान नहीं पाता है, तो यह इसे 1000 System.Web.Util.AppSettings.EnsureSettingsLoaded(एक आंतरिक स्थिर वर्ग) में सेट कर देगा :

 _maxHttpCollectionKeys = 0x3e8;

इसके अलावा, एलेक्सी गुसरोव ने दो दिन पहले इस सेटिंग के बारे में ट्वीट किया:

और यहां जोनाथन नेस (सुरक्षा विकास प्रबंधक, MSRC) और पीट वॉस (सीनियर रिस्पांस कम्युनिकेशंस मैनेजर, भरोसेमंद कम्प्यूटिंग) के साथ एक प्रश्नोत्तर का आधिकारिक उत्तर दिया गया है:

प्रश्न: क्या AppSettings.MaxHttpCollectionKey नए पैरामीटर में फॉर्म प्रविष्टियों की अधिकतम संख्या है?

A: हाँ यह है।


25
आश्चर्यजनक। ये इस तरह के जवाब हैं जो मुझे
स्टैकओवरफ़्लो से

4
यह वास्तव में मदद करता है, काश मेरे पास एक और खाता होता, ताकि मैं +2 :) दे
सकूं

1
क्या यह पूरे सर्वर के लिए applicationhost.config में अपडेट किया जा सकता है? या machine.config?
औरयुहा

1
प्रति पृष्ठ स्तर पर इस सीमा को नियंत्रित करने का कोई तरीका? (यह भी यहां और यहां पूछा गया ।)
माइक गुथरी

1
कुछ लोगों ने वेब पेज की समीक्षा करने का सुझाव दिया है क्योंकि इसमें ये कई फ़ॉर्म फ़ील्ड नहीं होने चाहिए। लेकिन हमारे पास इस त्रुटि के लिए एक बहुत ही वैध परिदृश्य था - हमारे ग्राहक की ईकामर्स साइट में खरीदारी की टोकरी में बहुत सारी चीजें थीं और जब पृष्ठ पर वह पहुंच रही थी, तब हमें यह त्रुटि मिली थी। ऐसे मामलों में, अधिकतम मूल्य को ओवरराइड करना सबसे अच्छा विकल्प है।
अंकुर-एम।

18

आप में से जो अभी भी .NET 1.1 का उपयोग कर रहे हैं, उनके लिए यह सेटिंग web.config के माध्यम से कॉन्फ़िगर नहीं की गई है - यह एक रजिस्ट्री सेटिंग है (michielvoo के लिए हैट टिप, जैसा कि मैंने केवल रिफ्लेक्टर के माध्यम से इसे खोजा था, ठीक उसी तरह जैसे उसने उत्तर पाया)। नीचे दिया गया उदाहरण MaxHttpCollectionKeysविंडोज के 32-बिट संस्करणों पर 5000 सेट करता है:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\1.1.4322.0]
"MaxHttpCollectionKeys"=dword:00001388

64-बिट विंडोज संस्करण के लिए, Wow6432Node के तहत कुंजी सेट करें:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\ASP.NET\1.1.4322.0]
"MaxHttpCollectionKeys"=dword:00001388

क्या आपको इस बारे में कोई जानकारी है कि क्या DoS हमले के संबंध में 5000 एक उचित-सुरक्षित मूल्य है जो इस सुरक्षा फ़िक्स को कम करने वाला है? हम एक ही 5000 मूल्य का उपयोग कर रहे हैं, लेकिन मैं एक हमले में अनुरोध के अनुसार मूल्यों और सीपीयू समय की संख्या के बीच संबंधों पर कोई जानकारी नहीं पा सकता ...
ताओ

4

मैं सिर्फ अपना $ 0.02 यहां के लोगों की अजीबता को देखते हुए जोड़ना चाहता हूं।

यदि आपका एप्लिकेशन ASP.NET ViewState में पेज की जानकारी को चुरा लेता है, और वेब सर्वर सीमा से अधिक हो जाता है, तो आप इस समस्या में भाग लेंगे। सीधे web.config को ठीक करने की समस्या को दूर करने के बजाय आप पहले अपने कोड को अनुकूलित करने पर एक नज़र रखना चाहते हैं।

स्रोत देखें, और 1000 + छिपे हुए फ़ील्ड देखें, और आपको अपनी समस्या मिल गई है।


1000+ व्यूस्टेट क्षेत्र? क्या फॉर्म में सिर्फ एक ViewState फ़ील्ड नहीं है। मान वह है जो प्रपत्र फ़ील्ड की संख्या बढ़ने पर बढ़ता है।
अंकुर-एम।

3

ThrowIfMaxHttpCollectionKeysExceeded()को भी जोड़ा गया है System.Web.HttpCookieCollection

ऐसा लगता है कि जब HttpCookieCollection.Get()कॉल किया जाता है, तो यह आंतरिक रूप से कॉल कर रहा है HttpCookieCollection.AddCookie(), जो तब कॉल कर रहा है ThrowIfMaxHttpCollectionKeysExceeded()

public HttpCookie Get(string name)
{
    HttpCookie cookie = (HttpCookie) base.BaseGet(name);
    if ((cookie == null) && (this._response != null))
    {
        cookie = new HttpCookie(name);
        this.AddCookie(cookie, true);
        this._response.OnCookieAdd(cookie);
    }
    return cookie;
}

internal void AddCookie(HttpCookie cookie, bool append)
{
    this.ThrowIfMaxHttpCollectionKeysExceeded();
    this._all = null;
    this._allKeys = null;
    if (append)
    {
        cookie.Added = true;
        base.BaseAdd(cookie.Name, cookie);
    }
    else
    {
        if (base.BaseGet(cookie.Name) != null)
        {
            cookie.Changed = true;
        }
        base.BaseSet(cookie.Name, cookie);
    }
}

हम जो देख रहे हैं, वह यह है कि जब तक यह फेंकना शुरू नहीं होता, तब तक वेबसाइट पर कुछ घंटों की अवधि में उत्तरोत्तर धीमी और बगियर हो जाती है InvalidOperationExcpetion। हम फिर ऐप-पूल को रीसायकल करते हैं, जो कुछ और घंटों के लिए समस्या को ठीक करता है।


कुकी गणना सीमा एक अच्छी पकड़ है; आपके द्वारा वर्णन किए जाने वाले धीमेपन और दुर्बलता के लिए, क्या आप जानते हैं कि क्या वास्तव में अनुरोधों में कुकी के साथ इसका कोई लेना देना है? क्या आपने ग्राहक के अनुरोधों की जांच की है? (क्या आपका ऐप उद्देश्यपूर्ण तरीके से बड़ी संख्या में कुकीज़ के साथ कुछ कर रहा है?)
ताओ

1
यह पता चलता है कि हमारे पास एक कस्टम कुकीप्रोविडर था जो गलत तरीके से एक सिंगलटन रिक्वेस्ट को हथियाने का अनुरोध कर रहा था। ऐप स्टार्ट-अप पर कूकियों का संग्रह, फिर बाद के प्रत्येक अनुरोध पर, यह देखने के लिए जाँच करेगा कि स्थिर कुकी संग्रह में एक या अधिक कुकीज़ मौजूद हैं या नहीं। ... जैसा कि आप ऊपर दिए गए कोड से देख सकते हैं, .net ADDS कि कुकी डिफ़ॉल्ट रूप से अगर यह नहीं मिली है। इसलिए समय के साथ, जैसा कि प्रत्येक उपयोगकर्ता सिस्टम तक पहुंच रहा था, इस सिंगलटन संग्रह में विभिन्न कुकीज़ जोड़ी जा रही थीं ... और चूंकि साइट कुकीज़ के साथ या इसके बिना काम करने के लिए डिज़ाइन की गई थी, इसलिए इस बग की पहचान अब तक नहीं की गई थी
जोशुआ बार्कर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.