2012-12-04 14 views
8

मेरे पास एक PHP (PHP 5.3.2) अनुप्रयोग है जो Linux सर्वर पर अपाचे (2.2.14) पर चल रहा है। इसके बाद एक बार इतिहास के उपयोगकर्ता ने अपने ब्राउज़र में निम्नलिखित संदेश को देखना शुरू कर दिया: "अनुरोध इकाई बहुत बड़ी है"। पहली Google खोज ने सुझाव दिया कि यह तब होता है जब अपलोड की गई फ़ाइल बहुत बड़ी होती है या जब कुकीज़ बहुत बड़ी होती है। लेकिन यह फ़ाइल अपलोड पर नहीं हो रहा है, केवल लॉग इन पेज पर और हमेशा लॉग इन पेज पर। उपयोगकर्ता इस पृष्ठ को केवल पृष्ठ पर सामान्य पोस्ट फ़ॉर्म के माध्यम से दर्ज करता है। और कुकीज़ में केवल सत्र आईडी है।अपाचे, PHP अमान्य सामग्री की लंबाई

इसके अलावा, अपाचे "अवैध सामग्री-लंबाई" लॉगिंग कर रहा है। मेरे किसी भी कोड निष्पादन से पहले यह लॉग किया जा रहा है। कुछ डेटा होने के बावजूद $ _POST खाली है। जब मैं निम्नलिखित लाइन कहा:

error_log("Content-Length: ".$_SERVER['CONTENT_LENGTH']); 

यह कहता है

Content-Length: 32, 32 

जो वास्तव में अमान्य हो रहा है। ब्राउज़र बदलना या उपयोगकर्ता पीसी को रीसेट करना मदद नहीं करता है। सब कुछ अभी अगले दिन काम करना शुरू कर दिया।

समस्या कहां रख सकती है? क्या यह अपाचे, PHP, उपयोगकर्ता की नेटवर्क सेटिंग्स के साथ कुछ है? अगर मुझे कुछ और जानकारी जोड़ने की ज़रूरत है, तो कृपया मुझे बताएं।

+1

हो सकता है कि [इस उत्तर] (http://stackoverflow.com/questions/1361451/get-size-of-post-request-in-php#3259068) मदद मिल सकती है। – Wh1T3h4Ck5

+0

मैं उन विकल्पों में से कुछ कोशिश कर रहा था लेकिन बिना किसी परिणाम के। उदाहरण के strlen के लिए (file_get_contents ('php: // इनपुट')) 0. – PWojnar

+1

कोशिश है: 'strlen (file_get_contents ('php: // stdin'))' बजाय – Dale

उत्तर

2

इस तरह के मुद्दों की जांच करने का सबसे आसान तरीका क्लाइंट और सर्वर के बीच भेजे गए पैकेट को कैप्चर करने के लिए TCPDump का उपयोग करना है, और फिर पैकेट को टीसीपी स्ट्रीम के रूप में देखने के लिए Wireshark का उपयोग करें।

पैकेट को कैप्चर करने के लिए कमांड का एक उदाहरण होगा।

tcpdump -vvv -एक मैं eth0 'होस्ट 123.123.10.12 & & पोर्ट 80' डब्ल्यू

eth0.dat यह आपके लॉगिन पृष्ठ है, के रूप में, आप शायद टीसीपी धारा डिकोड करने के लिए के रूप में यह होना चाहिए की आवश्यकता होगी एचटीटीपीएस के पीछे - http://segfault.in/2010/11/decrypt-https-traffic-using-wireshark-and-key-file/

प्लाज्मिड 87 लगभग निश्चित रूप से सही है - ऐसा लगता है जैसे हेडर में से एक बड़े पैमाने पर बढ़ रहा है और अंततः अपाचे LimitRequestFieldSize से बड़ा हो रहा है।

जब तक यह एक बार में धीरे-धीरे बढ़ रहा है, तो आप वैश्विक चर की जांच करके इसकी जांच कर सकते हैं।

function checkVars(){ 
    $varsToCheck = array($GLOBALS, $_SERVER, $_GET, $_POST, $_FILES, $_REQUEST, $_SESSION, $_ENV, $_COOKIE); 

    foreach($varToCheck as $var){ 
     foreach($var as $key => $value){ 

      if(count($key) > 1024){ 
       logToFile("Found ridiculous key: ".$key." value is ".$value); 
      } 
      if(count($value) > 1024){ 
       logToFile("Found ridiculous value for key: ".$key." value is ".$value); 
      } 
     } 
    } 
} 
5

पिछले दिनों में हमने apache द्वारा त्रुटि_log में लॉग इन "अमान्य सामग्री-लंबाई" संदेशों का सामना किया। , बस कुछ ही विशिष्ट IP वर्गों से कुछ आगंतुक को मुद्दा ट्रैक उदाहरण Movistar अर्जेंटीना के लिए: 200.81.44.201 आगे/whireshark हमने देखा है कि पोस्ट अनुरोध कुछ

duplicate Headers, namely Content-Length and Content-Type

असली मुद्दा निहित tcpdump साथ अनुरोध जाँच , साथ सामग्री-लंबाई है, क्योंकि अपाचे एकाधिक चर का इलाज, उन्हें श्रृंखलाबद्ध से, उदाहरण के लिए:

Content-Length: 51 
Content-Length: 51 

परिणाम होगा:

Content-Length: 51, 51 

तब अपाचे स्ट्रिंग को "51, 51" को एक पूर्णांक में बदलने की कोशिश करता है जो संभव नहीं है। नए अपाचे> 2.2 में।17, या बैकपोर्टेड पैच के साथ अपाचे एक त्रुटि लॉग करता है: 413 पुरानी अपाचे के साथ अनुरोध इकाई बहुत बड़ी है, प्रक्रिया बस बहुत सी CPU बार ​​उपभोग करती है। कि आईपी वर्ग हम अधिक विशिष्ट ग्राहकों को देखने के पीछे है, तो हो सकता है वे कर रहे हैं 3 जी प्रवेश द्वार प्रॉक्सी सर्वर को गलत तरीके से कॉन्फ़िगर किया गया, क्योंकि वे उस हेडर नकल। तो हम अपाचे कॉन्फ़िगर करने के लिए सिर्फ एक सामग्री-लंबाई और एक सामग्री प्रकार हेडर अनुरोध को फिर से लिखने का समाधान खोजने: यहाँ इस के लिए मेरे कोड, mod_headers का उपयोग कर रहा है, और httpd.conf में डाला SetEnvIfNoCase:

SetEnvIfNoCase Content-Length (.*), MyContentLength=$1 
SetEnvIfNoCase Content-Type (.*), MyContentType=$1 
RequestHeader set Content-Length: "%{MyContentLength}e" env=MyContentLength 
RequestHeader set Content-Type: "%{MyContentType}e" env=MyContentType 

आप परीक्षण और व्यवस्था डुप्लिकेट सामग्री-लंबाई HTTP हेडर के चर को फिल्टर करने में इस कोड का उपयोग करने के लिए स्वतंत्र हैं।

संबंधित मुद्दे