कौन से $ _SERVER चर सुरक्षित हैं?


97

कोई भी चर जो एक उपयोगकर्ता नियंत्रित कर सकता है, एक हमलावर भी नियंत्रित कर सकता है और इसलिए एक हमले का एक स्रोत है। इसे "दागी" चर कहा जाता है, और असुरक्षित है।

उपयोग करते समय $_SERVER, कई चर को नियंत्रित किया जा सकता है। PHP_SELF, HTTP_USER_AGENT, HTTP_X_FORWARDED_FOR, HTTP_ACCEPT_LANGUAGEऔर कई अन्य लोगों HTTP अनुरोध ग्राहक द्वारा भेजे गए हेडर का एक हिस्सा हैं।

क्या कोई "सुरक्षित सूची" या $_SERVERचरों की अप्राप्य सूची के बारे में जानता है ?


8
निर्भर करता है कि आप "सुरक्षित" कैसे परिभाषित करते हैं। मान सभी के रूप में सुरक्षित हैं, यह केवल निर्भर करता है कि आप उनके लिए क्या उपयोग करते हैं।
deceze

6
मुझे लगता है कि इस संदर्भ में, रूक कह रहा है कि "कौन सा सर्वर चर उपयोगकर्ता द्वारा खराब नहीं किया जा सकता है", जैसे REMOTE_ADDR
vcsjones

6
किसी भी चीज़ के साथ HTTP_पूर्व-निर्धारित एक अनुरोध शीर्षलेख है और इसे बीच में ब्राउज़र या प्रॉक्सी द्वारा सेट किया जा सकता है। मैं उन पर किसी अन्य उपयोगकर्ता इनपुट के रूप में विचार करूंगा।
23

3
@ bob-the-विनाशक REMOTE_ADDR को Apache के TCP सॉकेट से सीधे खींचा जाता है, यह मान तीन रास्तों पर होने के कारण इंटरनेट पर खराब नहीं हो सकता है
किश्ती

2
@Rook: अच्छी बात है। मैं "स्पूफिंग" के उल्लेख के साथ अनुमान लगाता हूं, मैं आईपी स्पूफिंग के पुराने अधिनियम के प्रति अधिक झुकाव था, इसके बजाय किसी भी प्रकार के वास्तविक मूल्य को फीका करने के बजाय REMOTE_ADDR। और वह इस प्रश्न के दायरे से बाहर होगा। इस मूल्य को कैसे निर्धारित किया जाता है, इसलिए कुछ धन्यवाद पाने के लिए अच्छा है, इसलिए धन्यवाद।
बॉब-द-डिस्ट्रॉयर

जवाबों:


147

"सुरक्षित" या "असुरक्षित" मानों जैसी कोई चीज नहीं है। केवल ऐसे मान हैं जो सर्वर को नियंत्रित करता है और उन मूल्यों को जो उपयोगकर्ता नियंत्रित करता है और आपको इस बात से अवगत होना चाहिए कि एक मूल्य कहां से आता है और इसलिए यह निश्चित उद्देश्य के लिए विश्वसनीय हो सकता है या नहीं। $_SERVER['HTTP_FOOBAR']उदाहरण के लिए डेटाबेस में स्टोर करना पूरी तरह से सुरक्षित है, लेकिन मैं निश्चित रूप से ऐसा नहीं करूंगा eval

जैसे, उन मूल्यों को तीन श्रेणियों में विभाजित करते हैं:

सर्वर नियंत्रित

ये चर सर्वर वातावरण द्वारा निर्धारित किए जाते हैं और पूरी तरह से सर्वर कॉन्फ़िगरेशन पर निर्भर करते हैं।

  • 'GATEWAY_INTERFACE'
  • 'SERVER_ADDR'
  • 'SERVER_SOFTWARE'
  • 'DOCUMENT_ROOT'
  • 'SERVER_ADMIN'
  • 'SERVER_SIGNATURE'

आंशिक रूप से सर्वर नियंत्रित

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

  • 'HTTPS'
  • 'REQUEST_TIME'
  • 'REMOTE_ADDR' *
  • 'REMOTE_HOST' *
  • 'REMOTE_PORT' *
  • 'SERVER_PROTOCOL'
  • 'HTTP_HOST'
  • 'SERVER_NAME'
  • 'SCRIPT_FILENAME'
  • 'SERVER_PORT'
  • 'SCRIPT_NAME'

* REMOTE_मानों की गारंटी क्लाइंट के वैध पते के रूप में दी जाती है, जो कि टीसीपी / आईपी हैंडशेक द्वारा सत्यापित है। यह वह पता है जहां किसी भी प्रतिक्रिया को भेजा जाएगा। REMOTE_HOSTहालांकि रिवर्स DNS लुकअप पर निर्भर करता है और इसलिए आपके सर्वर के विरुद्ध DNS हमलों (जिस स्थिति में आपको कोई बड़ी समस्या है) के कारण खराब हो सकता है। यह मान एक प्रॉक्सी हो सकता है, जो कि टीसीपी / आईपी प्रोटोकॉल की एक सरल वास्तविकता है और आपके बारे में कुछ भी नहीं कर सकता है।

Server यदि आपका वेब सर्वर हेडर की परवाह किए बिना किसी भी अनुरोध का जवाब देता है HOST, तो इसे असुरक्षित भी माना जाना चाहिए। देखें कि $ _SERVER ["HTTP_HOST"] कितना सुरक्षित है?
यह भी देखें http://shiflett.org/blog/2006/mar/server-name-versus-http-host

https://bugs.php.net/bug.php?id=64457 , http://httpd.apache.org/docs/current/mod/core.html#usecanonicalphysicalport , http: //httpd.apache देखें। org / docs / 2.4 / आधुनिक / core.html # comment_999

पूरी तरह से मनमाना उपयोगकर्ता नियंत्रित मूल्य

ये मान बिल्कुल भी चेक नहीं किए जाते हैं और किसी भी सर्वर कॉन्फ़िगरेशन पर निर्भर नहीं करते हैं, ये पूरी तरह से ग्राहक द्वारा भेजी गई मनमानी जानकारी हैं।

  • 'argv', 'argc'(केवल CLI आह्वान पर लागू होता है, आमतौर पर वेब सर्वर के लिए चिंता का विषय नहीं)
  • 'REQUEST_METHOD' §
  • 'QUERY_STRING'
  • 'HTTP_ACCEPT'
  • 'HTTP_ACCEPT_CHARSET'
  • 'HTTP_ACCEPT_ENCODING'
  • 'HTTP_ACCEPT_LANGUAGE'
  • 'HTTP_CONNECTION'
  • 'HTTP_REFERER'
  • 'HTTP_USER_AGENT'
  • 'AUTH_TYPE'
  • 'PHP_AUTH_DIGEST'
  • 'PHP_AUTH_USER'
  • 'PHP_AUTH_PW'
  • 'PATH_INFO'
  • 'ORIG_PATH_INFO'
  • 'REQUEST_URI' (दागी डेटा हो सकता है)
  • 'PHP_SELF' (दागी डेटा हो सकता है)
  • 'PATH_TRANSLATED'
  • कोई अन्य 'HTTP_'मूल्य

§ तब तक विश्वसनीय माना जा सकता है जब तक वेब सर्वर केवल कुछ निश्चित अनुरोध विधियों की अनुमति देता है।

विश्वसनीय माना जा सकता है अगर प्रमाणीकरण पूरी तरह से वेब सर्वर द्वारा नियंत्रित किया जाता है।

सुपरग्लोबल $_SERVERमें कई पर्यावरण चर भी शामिल हैं। ये "सुरक्षित" हैं या नहीं, यह इस बात पर निर्भर करता है कि वे कैसे (और कहाँ) परिभाषित हैं। वे पूरी तरह से नियंत्रित उपयोगकर्ता से लेकर पूरी तरह से नियंत्रित उपयोगकर्ता तक हो सकते हैं।


3
@Rook लेकिन जैसा कि मैंने कहा, यह पूरी तरह से इस बात पर निर्भर करता है कि आप इसका उपयोग कैसे करते हैं । केवल स्वयं के मूल्य ही सुरक्षित या असुरक्षित नहीं हैं, यह इस बात पर निर्भर करता है कि आप उनके लिए क्या उपयोग करते हैं । यहां तक ​​कि एक नापाक उपयोगकर्ता से भेजा गया डेटा तब तक पूरी तरह से सुरक्षित है जब तक आप इसके साथ कुछ भी नहीं कर रहे हैं जो आपकी सुरक्षा से समझौता कर सकता है।
deceze

2
@Rook: "सुरक्षित" का आपका विचार इस सवाल को थोड़ा मनमाना लगता है, खासकर जब से यह पूरी तरह से एक अस्पष्ट एक्सटेंशन या PHP के कस्टम संस्करण से बंधा है। जब आप कहते हैं कि "कूल्हे से" दृष्टिकोण "शूट नहीं करना चाहिए", तो वास्तव में इन मूल्यों को कैसे सेट किया जाता है, यह पता लगाने के लिए किसी भी उत्तर को PHP सोर्सकोड के साथ न्यूनतम परिचितता की आवश्यकता होती है। क्या उत्तर देने के लिए PHP देवों को ईमेल करना बेहतर तरीका नहीं होगा?
बोब-

2
@Rook: संचार। जैसा कि धोखा दिया गया है, "किस उद्देश्य के लिए सुरक्षित है"। जैसा कि मैंने संकेत दिया है, आपका उद्देश्य अज्ञात है, और इसके अलावा $_SERVERफ़ाइल को कैसे परोसा जाता है, इसके आधार पर कई अन्य अवांछित मान हैं। मेरी राय में, प्रलेखित लोग सच्चे स्रोत को स्पष्ट नहीं करते हैं। अन्यथा मुझे विश्वास है कि आप यह सवाल नहीं पूछेंगे। खुशी है कि आपको एक सूची मिली जिसका आप उपयोग कर सकते हैं। लेकिन मैं अभी भी एक बग रिपोर्ट (जब उनकी बग साइट तय हो गई है) सबमिट करने का सुझाव दूंगा, डॉक अनुरक्षकों को एक ईमेल भेजना, या डॉक्स को स्वयं अपडेट करना (यदि आप लिंक के लिए निजी हैं)। इस जानकारी को जानने के लिए समुदाय को लाभ होगा।
बॉब-द-डिस्ट्रॉयर

3
SERVER_NAMEजरूरी सर्वर द्वारा नियंत्रित नहीं है। गेटवे और सेटिंग्स के आधार पर इसे डुप्लिकेट किया जा सकता है HTTP_HOSTऔर इसलिए एक ही चेतावनी के अधीन है।
बोबिन्स

1
@deceze @Rook क्या SERVER_PORTउस छोटे से पार की जरूरत है? Bugs.php.net/bug.php?id=64457
देजन

12

PHP में प्रत्येक $_SERVERचर जो HTTP_उपयोगकर्ता के साथ शुरू होता है, प्रभावित हो सकता है। उदाहरण के लिए $_SERVER['HTTP_REINERS']HTTP हेडर REINERSको HTTP रिक्वेस्ट में मनमाने मूल्य पर सेट करके वैरिएबल को टैन्ट किया जा सकता है ।


फिर से "मनमाना"; संपूर्ण मनमाना नहीं, क्योंकि वे एक प्रारूप के अनुरूप हैं। उदाहरण के लिए, $_SERVER['HTTP_REINERS'] अधिकांश सापियों के अंतर्गत न्यूलाइन वर्ण नहीं हो सकते।
पेसर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.