$ _REQUEST [] का उपयोग करने में क्या गलत है?


116

मैंने यहाँ कई पोस्टों को $_REQUESTचर का उपयोग न करने के लिए कहा है । मैं आमतौर पर नहीं है, लेकिन कभी-कभी यह सुविधाजनक है। इसके साथ गलत क्या है?


2
संबंधित प्रश्न और उत्तर देखें: stackoverflow.com/questions/1149118/…
गॉर्डन

2
5.3 php के बाद से डिफ़ॉल्ट php.ini का कहना है कि केवल GET और POST डेटा ही डाले जाते हैं $_REQUEST। देखें php.net/request_order मैं बस जब कुकी डेटा में होने की उम्मीद कर इस पीछे की ओर-संगतता को तोड़ने पर ठोकर खाई $_REQUESTऔर सोच क्यों यह काम नहीं कर रहा था! इसलिए $ _REQUEST का उपयोग करने से बचने का सबसे बड़ा कारण यह है कि आपकी स्क्रिप्ट request_orderस्वयं सेट नहीं हो सकती (यह है PHP_INI_PERDIR), इसलिए php.ini परिवर्तन आसानी से आपकी स्क्रिप्ट पर बनी मान्यताओं को तोड़ सकता है। उन मान्यताओं को सीधे अपनी स्क्रिप्ट में डालने के लिए बेहतर है।
डैरेन कुक

जवाबों:


184

संयुक्त रूप से $_GETऔर $_POSTसंयुक्त रूप से इनपुट लेने में कुछ भी गलत नहीं है । वास्तव में यह है कि आप लगभग हमेशा क्या करना चाहते हैं:

  • जीईटी के माध्यम से आम तौर पर प्रस्तुत किए गए एक सादे सुखद अनुरोध के लिए, आपके द्वारा इच्छित डेटा की मात्रा URL में फिट नहीं होगी, इसलिए इसे व्यावहारिक मामले के बजाय POST अनुरोध में बदल दिया गया है।

  • उस अनुरोध के लिए जिसका वास्तविक प्रभाव है, आपको यह जांचना होगा कि यह POST विधि द्वारा प्रस्तुत किया गया है। लेकिन ऐसा करने का तरीका $_SERVER['REQUEST_METHOD']स्पष्ट रूप से जांचना है , न कि $_POSTएक जीईटी के लिए खाली होने पर भरोसा करना । और वैसे भी अगर विधि है POST, तो आप अभी भी URL से कुछ क्वेरी पैरामीटर लेना चाह सकते हैं।

नहीं, समस्या $_REQUESTयह है कि GET और POST मापदंडों को भ्रमित करने से कोई लेना-देना नहीं है। यह है कि यह भी, डिफ़ॉल्ट रूप से, शामिल है $_COOKIE। और कुकीज़ वास्तव में फ़ॉर्म सबमिशन मापदंडों की तरह नहीं हैं: आप लगभग उन्हें एक ही चीज़ के रूप में व्यवहार नहीं करना चाहते हैं।

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

आप इस व्यवहार को PHP 5.3 में request_order कॉन्फ़िगरेशन के साथ बहुत अधिक समझदार GP(नहीं C) क्रम में बदल सकते हैं । जहां यह संभव नहीं है, मैं व्यक्तिगत रूप से बचूंगा और अगर मुझे एक संयुक्त GET + POST सरणी की आवश्यकता है, तो इसे मैन्युअल रूप से बनाएं।$_REQUEST


2
इन स्थितियों (जीईटी के माध्यम से प्रस्तुत किए जाने वाले डेटा बहुत लंबे समय तक) एक अपवाद हैं, एक नियम नहीं
बेन जेम्स

1
अच्छा उत्तर। मैंने यह भी देखा कि Zend फ्रेमवर्क GET और POST params जैसे फ्रेमवर्क को 1 अनुरोध ऑब्जेक्ट में संयोजित किया गया है। जब तक मैंने आपकी पोस्ट नहीं पढ़ी, यह मुझे नहीं लगा।
जय सिदरी

डिफ़ॉल्ट रूप से request_order कॉन्फ़िगरेशन php.ini में PHP 5.4+ के रूप में "GP" पर सेट है, इसलिए मैं कहूंगा कि मैं इसके लिए जाऊंगा ... लेकिन हमेशा की तरह, सावधानी के साथ आगे बढ़ें।
bcmoney

यदि $ _POST a="foo"और $ _COOKIE है a="bar", तो क्या यहां कोई ओवरराइड / संघर्ष होगा?
जंग

75

मैं PHP इंटरनैशनल पर कुछ समाचार समूह पोस्ट के माध्यम से खुदाई कर रहा हूं और इस विषय के बारे में एक दिलचस्प चर्चा की। प्रारंभिक धागा कुछ और के बारे में था, लेकिन स्टीफन एसेर की एक टिप्पणी, (अगर नहीं तो ) PHP दुनिया में सुरक्षा विशेषज्ञ ने कुछ पदों के लिए $ _REQUEST का उपयोग करने के सुरक्षा निहितार्थ की चर्चा को बदल दिया।

PHP इंटरनैशनल पर स्टीफन एस्सर का हवाला देते हुए

$ _REQUEST PHP में सबसे बड़ी डिज़ाइन कमजोरियों में से एक है। $ _REQUEST का उपयोग करने वाला प्रत्येक एप्लिकेशन संभवतः सबसे अधिक विलंबित क्रॉस साइट अनुरोध फोर्जरी समस्याओं के लिए असुरक्षित है। (यह मूल रूप से इसका मतलब है अगर उदाहरण के लिए एक कुकी नाम (आयु) मौजूद है तो यह हमेशा GET / POST सामग्री को अधिलेखित कर देगा और इसलिए अवांछित अनुरोध किए जाएंगे)

और बाद में उसी धागे के उत्तर में

यह इस तथ्य के बारे में नहीं है कि कोई व्यक्ति जीईटी, पीओटीएस का समर्थन कर सकता है; COOKIE चर। यह इस तथ्य के बारे में है कि COOKIEs REQUEST में GET और POST डेटा को अधिलेखित कर देंगे।

इसलिए मैं आपके ब्राउज़र को कुकी के साथ संक्रमित कर सकता हूं जो कहता है जैसे कि एक्शन = लॉगआउट और उस दिन से आप अब एप्लिकेशन का उपयोग नहीं कर सकते क्योंकि REQUEST [एक्शन] हमेशा के लिए लॉगआउट हो जाएगा (जब तक आप मैन्युअल रूप से कुकी को हटा नहीं देते)।

और एक COOKIE के साथ आपको संक्रमित करने के लिए बहुत सरल है ...
क) मैं एक उप-डोमेन पर किसी भी आवेदन में एक XSS vuln का उपयोग कर सकता था
बी) कभी भी * .co.uk या * .co.kr के लिए एक कुकी सेट करने की कोशिश की जब आप खुद के पास। वहाँ एकल डोमेन?
ग) अन्य क्रॉस डोमेन जो भी तरीके ...

और अगर आपको लगता है कि यह कोई मुद्दा नहीं है, तो मैं आपको बता सकता हूं कि फ़े * .co.kr कुकी को सेट करने की एक सरल संभावना है, जिसके परिणामस्वरूप कई PHP संस्करण बस सफेद पन्नों को वापस करते हैं। कल्पना कीजिए: * .co.kr में सभी PHP पृष्ठों को मारने के लिए सिर्फ एक कुकी

और एक कुकी में एक अवैध सत्र आईडी सेट करके * .co.kr के लिए एक वैरिएबल + PHPSESSID = अवैध में आप अभी भी PHP सत्र का उपयोग कर कोरिया में हर PHP आवेदन डॉस कर सकते हैं ...

चर्चा कुछ और पोस्टिंग के लिए जारी है और पढ़ने के लिए दिलचस्प है।


जैसा कि आप देख सकते हैं, $ _REQUEST के साथ मुख्य समस्या इतनी नहीं है कि इसमें $ _GET और $ _POST से डेटा है, बल्कि $ _COOKIE से भी है। सूची में कुछ अन्य लोगों ने उस आदेश को बदलने का सुझाव दिया जिसमें $ _REQUEST भरा हुआ है, जैसे कि पहले इसे $ _COOKIE से भरना, लेकिन इससे कई अन्य संभावित समस्याएं हो सकती हैं, उदाहरण के लिए सत्र हैंडलिंग

आप $ _REQUEST वैश्विक हालांकि से पूरी तरह से न आना $ _COOKIES कर सकते थे, इतना है कि यह अन्य सारणियों के किसी भी (वास्तव में, आप इसे यह मानक सामग्री के किसी भी संयोजन के लिए, की तरह सीमित कर सकते हैं द्वारा ओवरराइट नहीं है पर पीएचपी मैनुअल variable_order आरं सेटिंग हमें बताइये:

वेरिएबल_ऑर्डर ईजीपीसीएस (एनवायरनमेंट, गेट, पोस्ट, कुकी और सर्वर) वेरिएबल पार्सिंग का क्रम सेट करता है। उदाहरण के लिए, यदि वेरिएबल_ऑर्डर "SP" पर सेट है तो PHP सुपरग्लोबल्स $ _SERVER और $ _POST बनाएगी, लेकिन $ _ENV, $ _GET और $ _COOKIE नहीं बनाएगी। "" पर सेट करने का अर्थ है कि कोई सुपरग्लोब सेट नहीं किया जाएगा।

लेकिन फिर, आप $ _REQUEST का उपयोग पूरी तरह से नहीं करने पर भी विचार कर सकते हैं, केवल इसलिए कि PHP में आप अपने स्वयं के ग्लोबल्स में एन्वायरनमेंट, गेट, पोस्ट, कुकी और सर्वर तक पहुंच सकते हैं और एक हमला वेक्टर कम है। आपको अभी भी इस डेटा को साफ करना है, लेकिन इसके बारे में चिंता करना एक कम बात है।


अब आप सोच सकते हैं कि, $ _REQUEST आखिर क्यों मौजूद है और इसे क्यों नहीं हटाया गया। यह PHP इंटरनैशनल पर भी पूछा गया था। रास्मस लेरडोर्फ का हवाला देते हुए $ _REQUEST क्यों मौजूद है? PHP आंतरिक पर

हम जितना अधिक सामान निकालते हैं, यह उतना ही कठिन होता जाता है कि लोग पीएचपी के नए, तेज और अधिक सुरक्षित संस्करणों की ओर तेजी से बढ़ते हैं। यह कुछ "बदसूरत" विरासत सुविधाओं की तुलना में सभी के लिए अधिक निराशा का कारण बनता है। यदि कोई अच्छा तकनीकी कारण, प्रदर्शन या सुरक्षा है, तो हमें इस पर एक सख्त नज़र डालने की आवश्यकता है। इस मामले में, हम जिस चीज को देख रहे हैं वह यह है कि क्या हमें $ _REQUEST को नहीं हटाना चाहिए लेकिन क्या हमें इससे कुकी डेटा को हटा देना चाहिए। कई कॉन्फ़िगरेशन पहले से ही मेरे सभी सहित, और $ _REQUEST में कुकीज़ को शामिल नहीं करने के लिए एक मजबूत वैध सुरक्षा कारण है। अधिकांश लोग GET या POST का अर्थ $ _REQUEST का उपयोग करते हैं, यह महसूस न करने के लिए कि इसमें कुकीज़ भी हो सकती हैं और जैसे कि बुरे लोग संभावित रूप से कुछ कुकी इंजेक्शन चालें कर सकते हैं और भोले अनुप्रयोगों को तोड़ सकते हैं।

वैसे भी, उम्मीद है कि कुछ प्रकाश डाला।


1
इस की कुछ चर्चा देखने के लिए अच्छा है ... मुझे लगा कि मैं पागल हो रहा था!

2
मुझे लगता है कि चर्चा थोड़ी अधिक थी। वास्तविक समस्या डेवलपर अनौचित्य है, न कि कुकीज़ का अस्तित्व $ _REQUEST प्रति से। उदाहरण के लिए निर्धारित PHPSESSID समकालीन सत्र हैंडलिंग कोड के साथ वैसे भी प्रति-डोमेन कुकी के साथ रीसेट होने जा रहा है। और कुछ अनुप्रयोगों के लिए एक कुकी ओवरराइडिंग अनुरोध var वास्तव में वांछनीय हो सकते हैं (जैसे Sort_order = ASC एक खोज फ़ॉर्म GET var को ओवरराइड करता है)। हालांकि इस तरह के व्यवहार में कोडिंग स्पष्ट रूप से अधिक समझदार है।
मारियो

1
बहुत व्यापक पोस्ट, इसका उत्तर होना चाहिए। हो सकता है कि लोगों को लंबी पोस्ट का डर हो;)
डज़ुंग गुयेन

अफसोस की बात है कि 2009 में रसमस ने इस पर टिप्पणी की, और अभी तक $ _REQUEST 2015 में अनिवार्य रूप से अब एक ही है,
कज़कई

10

$_REQUESTसभी प्रकार के अनुरोधों (GET, POST आदि ..) को संदर्भित करता है। यह कभी-कभी उपयोगी होता है, लेकिन आमतौर पर सटीक विधि ($ _GET, $ _POST आदि) को निर्दिष्ट करना बेहतर होता है।


19
यह उत्तर बताता है कि $ _REQUEST क्या है, लेकिन यह प्रश्न का उत्तर नहीं देता है।
ज़ोम्बैट

1
वह कह रहा है कि यह जानना बेहतर है कि किस प्रकार का अनुरोध आने वाला है और उस विशिष्ट अनुरोध को कोड करने के लिए।
पोलारिस878

8

$_REQUEST आमतौर पर इसी कारण से हानिकारक माना जाता है कि सरल-से-मध्यम-जटिलता डेटा-परिवर्तन अक्सर SQL में घोषित किए गए के बजाय एप्लिकेशन कोड में किए जाते हैं: कुछ प्रोग्रामर चूसते हैं।

जैसे, यदि कोई $_REQUESTहर जगह उपयोग करता है, तो मैं GST के माध्यम से कुछ भी कर सकता हूं जो मैं POST के माध्यम से कर सकता हूं, जिसका अर्थ है कि <img>मेरे (दुर्भावनापूर्ण) साइट पर टैग सेट करना, जिसके कारण उपयोगकर्ता आपके ई-कॉमर्स मॉड्यूल में चुपचाप उत्पाद खरीदने के लिए लॉग इन करते हैं, या मैं उन्हें उन लिंक पर क्लिक करने का कारण बन सकता है जो खतरनाक कार्यों या संवेदनशील जानकारी के रहस्योद्घाटन (शायद मेरे लिए) का परिणाम होगा।

हालाँकि, यह एक नौसिखिया, या कम से कम अनुभवहीन होने के कारण, PHP प्रोग्रामर सरल गलतियाँ कर रहा है। सबसे पहले, यह जानें कि कब किस प्रकार का डेटा उपयुक्त है। उदाहरण के लिए, मेरे पास एक वेब सेवा है जो URLEncoding, XML या JSON में प्रतिक्रियाएं दे सकती है। एप्लिकेशन HTTP_ACCEPT हेडर की जांच करके प्रतिक्रिया को प्रारूपित करने का तरीका तय करता है, लेकिन formatपैरामीटर भेजकर विशेष रूप से एक में किया जा सकता है ।

प्रारूप पैरामीटर की सामग्री की जांच करते समय, इसे क्वेरिस्ट्रिंग या एक पोस्टडेटा के माध्यम से भेजा जा सकता है, जो कारकों की एक भीड़ पर निर्भर करता है, जिनमें से कम से कम नहीं है कि क्या कॉलिंग अनुप्रयोग चाहते हैं या नहीं, "& format = json" को इसके अनुरोध के साथ मिलाया गया है। इस मामले में, $_REQUESTबहुत सुविधाजनक है क्योंकि यह मुझे कुछ इस तरह टाइप करने के लिए बचाता है:

$format = isset($_POST['format']) ? $_POST['format'] 
    : (isset($_GET['format']) ? $_GET['format'] : null);

मैं बहुत आगे बढ़ने के लिए नहीं जा रहा हूं, लेकिन यह कहने के लिए पर्याप्त है कि $_REQUESTउपयोग को अस्वीकार नहीं किया गया है क्योंकि यह स्वाभाविक रूप से खतरनाक है - यह सिर्फ एक और उपकरण है जो इसके बारे में पूछा जाता है, चाहे आप उन निहितार्थों को समझें या नहीं - यह है एक गरीब, आलसी या अनुभवहीन प्रोग्रामर के खराब, आलसी या बिना किसी निर्णय के जो इस समस्या का कारण बनता है।

$_REQUESTसुरक्षित उपयोग कैसे करें


  1. अपने डेटा को जानें : आपको कुछ उम्मीदें होनी चाहिए कि आपको किस तरह का डेटा मिलेगा, इसलिए उसी के अनुसार इसे सैनिटाइज़ करें। डेटाबेस के लिए डेटा? addslashes()या *_escape_string()। इसे उपयोगकर्ता को वापस दिखाने के लिए जा रहे हैं? htmlentities()या htmlspecialchars()। संख्यात्मक डेटा की अपेक्षा करना? is_numeric()या ctype_digit()। वास्तव में, filter_input()और इसके संबंधित कार्यों को डेटा को जांचने और साफ करने के अलावा कुछ भी करने के लिए डिज़ाइन नहीं किया गया है। इन साधनों का सदैव उपयोग करें।
  2. सीधे उपयोगकर्ता द्वारा प्रदत्त सुपरग्लोब डेटा तक पहुंच न करें । अपने डेटा को हर बार सैनिटाइज़ करने की आदत डालें, और अपने डेटा को वैरिएबल को साफ करने के लिए स्थानांतरित करें, भले ही यह सिर्फ हो $post_clean। वैकल्पिक रूप से, आप केवल सुपरग्लोबल्स में सीधे सफाई कर सकते हैं, लेकिन इसका कारण मैं एक अलग चर का उपयोग करके वकालत करता हूं, क्योंकि ऐसा करने से कोड में कमजोरियों को पहचानना आसान हो जाता है, क्योंकि कुछ भी सुपरग्लोबल की ओर सीधे इशारा करता है और इसके स्वच्छता समकक्ष को एक खतरनाक त्रुटि नहीं माना जाता है। ।
  3. जानिए कि आपको कहां से डेटा आना चाहिए। ऊपर से मेरे उदाहरण को संदर्भित करते हुए, प्रतिक्रिया प्रारूप चर को GET या POST के माध्यम से भेजने की अनुमति देना पूरी तरह से उचित है। मैं "एक्शन" वैरिएबल को किसी भी विधि के माध्यम से भेजने की अनुमति देता हूं। हालाँकि, क्रियाएँ स्वयं के लिए बहुत विशिष्ट आवश्यकताएँ हैं, जिनके लिए HTTP Verb स्वीकार्य है । उदाहरण के लिए, सेवा द्वारा उपयोग किए गए डेटा में परिवर्तन केवल POST के माध्यम से भेजे जा सकते हैं। कुछ प्रकार के गैर- या निम्न-विशेषाधिकार वाले डेटा (जैसे गतिशील रूप से निर्मित मानचित्र छवियां) के लिए अनुरोध या तो विधि से अनुरोध के जवाब में किए जा सकते हैं।

निष्कर्ष में, इस सरल नियम को याद रखें:

सुरक्षा क्या आप इसे, लोगों को क्या है!

संपादित करें:

मैं बॉबिन की सलाह की दृढ़ता से सलाह देता हूं: यदि आप कर सकते हैं, तो request_orderphp.ini में पैरामीटर को "जीपी" पर सेट करें ; वह है, कोई कुकी घटक नहीं। 98% + मामलों में इसके लिए लगभग कोई तर्कसंगत तर्क नहीं है, क्योंकि कुकी डेटा को लगभग क्वेरिस्ट्रिंग या पोस्टडेटा के बराबर नहीं माना जाना चाहिए।

पुनश्च, किस्सा!

मैं एक ऐसे प्रोग्रामर को जानता था, जो $_REQUESTकेवल सुपरग्लोबल तरीके से सुलभ डेटा को स्टोर करने के लिए एक जगह के बारे में सोचते थे । महत्वपूर्ण उपयोगकर्ता नाम और पासवर्ड, फ़ाइलों के लिए पथ, आप इसे नाम देते हैं और इसे संग्रहीत किया गया था $_REQUEST। वह थोड़ा आश्चर्यचकित हुआ (हालाँकि हास्य रूप से ऐसा नहीं, दुर्भाग्य से) जब मैंने उसे बताया कि वह चर कैसा व्यवहार करता है। कहने की जरूरत नहीं है कि अभ्यास को हटा दिया गया है।


8

GET अनुरोधों को निष्प्रभावी होना चाहिए और POST अनुरोध आम तौर पर नहीं होते हैं। इसका मतलब है कि में डेटा $_GETऔर $_POSTआम तौर पर अलग अलग तरीकों से इस्तेमाल किया जाना चाहिए।

यदि आपका एप्लिकेशन डेटा का उपयोग कर रहा है $_REQUEST, तो यह GET और POST दोनों अनुरोधों के लिए समान व्यवहार करेगा, जो GET की बेरोजगारी का उल्लंघन करता है।


1
लेकिन क्या यह कार्यान्वयन पर निर्भर नहीं करता है? "Indempotent" मेरे लिए एक नया शब्द है, लेकिन अगर मैं इसे सही ढंग से समझ रहा हूँ, तो यह समझ लेना आसान होगा कि एक GET स्थिति की स्थापना की जाए जो कि Indempotent नहीं थी। उदाहरण के लिए, पृष्ठ काउंटर आमतौर पर दिए गए url का अनुरोध करने पर प्रत्येक बार बढ़ाते हैं।
स्प्रिगमैन

1
@sprugman - साथ ही, आपके पास ऐसी परिस्थितियाँ हो सकती हैं जहाँ आपके पास GET डेटा और POST डेटा दोनों एक ही अनुरोध में हों, उस स्थिति में अनुरोध डेटा के साथ प्रासंगिक होने पर अनुरोध विधि अनिवार्य रूप से निरर्थक है।
ज़ोम्बैट

sprugman, स्पष्ट रूप से कोई भी GET अनुरोध कुछ को संशोधित करता है क्योंकि यह वेब सर्वर द्वारा लॉग इन किया जाता है। यह अभी भी एप्लिकेशन के डोमेन में उदासीन हो सकता है, जहां यह मेटाडेटा वास्तव में मायने नहीं रखता है।
बेन जेम्स

@sprugman - यहाँ सामान्य विचार यह है कि आपके पास GET अनुरोध नहीं होना चाहिए जो डेटा को संशोधित करता है। यह खराब क्यों है, इसका एक विशिष्ट उदाहरण आपकी साइट को क्रॉल करना और अनजाने में डेटा को संशोधित करने वाले लिंक का अनुसरण करना होगा। उदाहरण के लिए एसओ पद पर "ध्वज" लिंक।
एरिक पेट्रोलेजे

यह एक तुच्छ उदाहरण था। कैसे के बारे में अगर मैं ajax के माध्यम से जीईटी का उपयोग कर रहा हूं, क्योंकि यह तेज है (जैसा कि इस पोस्ट में कार्सिफ़ाइड carsonified.com/blog/dev/the-definitive-guide-to-get-vs-post पर बताया गया है )।
sprugman

7

यह अस्पष्ट है। आपको वास्तव में नहीं पता है कि पोस्ट, कैरी और कुकी डेटा को कैरी करने के बाद से आपको डेटा कैसे मिला। मैं जरूरी नहीं समझता कि यह हमेशा एक बुरी बात है, जब तक कि आपको प्रसव की विधि जानने या प्रतिबंधित करने की आवश्यकता नहीं है।


3

मुझे वास्तव में इसका उपयोग करना पसंद है। यह आपको GET या POST का उपयोग करने की सुविधा देता है जो कि खोज रूपों जैसी चीज़ों के लिए काम में आ सकता है जहाँ अधिकांश समय डेटा POSTed होता है, लेकिन कभी-कभी आप किसी विशेष खोज के लिए लिंक कहना चाहेंगे, इसलिए आप इसके बजाय GET मापदंडों का उपयोग कर सकते हैं ।

इसके अलावा, यदि आप कई अन्य भाषाओं (उदाहरण के लिए ASP.NET) को देखते हैं तो वे GET और POST चर के बीच कोई अंतर नहीं करते हैं।

ईटीए :

मैंने कभी भी COOKIE मान प्राप्त करने के लिए REQUEST का उपयोग नहीं किया है, लेकिन मुझे लगता है कि काइल बट इस बारे में इस पोस्ट पर टिप्पणियों में एक महान बिंदु बनाता है। COOKIE मान प्राप्त करने के लिए REQUEST का उपयोग करना एक अच्छा विचार नहीं है। मेरा मानना ​​है कि वह सही है कि यदि आप ऐसा करते हैं तो क्रॉस-साइट अनुरोध जालसाजी के लिए कुछ वास्तविक संभावनाएं हैं।

इसके अलावा, जिस क्रम में सामान REQUEST में लोड हो जाता है, उसे php.ini (varables_order और request_order) में कॉन्फ़िगरेशन मापदंडों द्वारा नियंत्रित किया जाता है। इसलिए, यदि आपके पास POST और GET दोनों के माध्यम से एक ही वैरिएबल है, जो वास्तव में REQUEST में मिलता है, तो उन ini सेटिंग्स पर निर्भर करता है। यह पोर्टेबिलिटी को प्रभावित कर सकता है यदि आप किसी विशेष ऑर्डर पर निर्भर करते हैं और उन सेटिंग्स को अलग-अलग तरीके से कॉन्फ़िगर किया गया है जिससे आप उनकी अपेक्षा करते हैं।


यह एक बहुत बड़ी गलती है। आप इस बात की गारंटी कैसे दे सकते हैं कि नॉन-इम्पोटेंट एक्शन एक पोस्ट पर किए गए थे?
काइल बट

1
@ काइल - नॉन-इम्पोटेंट एक्शन के लिए इसका इस्तेमाल नहीं करने से। मैं निश्चित रूप से हर चीज के लिए इसका उपयोग नहीं करूंगा, बस यह इंगित करना कि यह उपयोगी है, जैसे खोजों के लिए जैसा कि मैंने अपने उदाहरण में उल्लेख किया है।
एरिक पेट्रोलेजे

1
यह जादुई विचार कि _POST सुरक्षित है और _GET को जाने के लिए नहीं मिला है। अगर मैं आपके सॉफ़्टवेयर का सही तरीके से उपयोग नहीं कर रहा हूं, तो POST अनुरोध बनाम GET अनुरोध भेजने में मेरे लिए बहुत कम (यदि कोई है) अंतर है। सुरक्षा वह है जो आप डेटा के साथ करते हैं, न कि जहां से यह आया है। सरल XSS / अनुरोध के कारनामों के लिए, यह पूरी तरह से संभवतः _REQUEST का उपयोग केवल उन मानों के लिए है जो POST या GET के साथ मान्य होंगे, और केवल उन चीजों के लिए _POST का उपयोग करें जिन्हें POST किया जाना चाहिए। सामान्य ज्ञान, जादुई सुपरग्लोबल उपयोग नहीं।
डेरेलिज्ड

1
@ काइल - मैं अभी भी नहीं देख पा रहा हूं कि आप ऐसा क्या कर सकते हैं जो आप आसानी से उल्लेख करते हैं जैसे कि कर्ल () या अजाक्स पोस्ट का उपयोग करके POST और COOKIE के माध्यम से उसी डेटा को पास करना। चाहे आप REQUEST, GET, POST या COOKIE का उपयोग करें, सभी डेटा अंततः क्लाइंट से आ रहे हैं और हमेशा फेक हो सकते हैं।
एरिक पेट्रोलेजे

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

2

POST का उपयोग कब करें, GET का उपयोग कब करें और कब कुकी का उपयोग करें यह समझना महत्वपूर्ण है। $ _REQUEST के साथ, जो मूल्य आप देख रहे हैं, उनमें से कोई भी हो सकता है। यदि आप किसी POST या GET से या COOKIE से मान प्राप्त करने की अपेक्षा करते हैं, तो $ _REQUEST के बजाय विशिष्ट चर का उपयोग करने के लिए आपके कोड को पढ़ने वाले किसी व्यक्ति के लिए यह अधिक जानकारीपूर्ण है।

किसी और ने यह भी बताया कि आप सभी POST या कुकीज़ को GETs द्वारा अधिलेखित नहीं करना चाहते हैं, क्योंकि उन सभी के लिए अलग-अलग क्रॉस-साइट नियम हैं, उदाहरण के लिए, यदि आप $ _REQUEST का उपयोग करते हुए ajax डेटा लौटाते हैं, तो आप असुरक्षित हैं एक क्रॉस साइट स्क्रिप्ट हमले के लिए।


2

केवल समय का उपयोग $_REQUESTकरना बुरा विचार नहीं है।

  • यदि आप इसका उपयोग POST मानों को लोड करने के लिए करते हैं, तो आप क्रॉस-साइट अनुरोध forgeries को जोखिम में डालते हैं
  • यदि आप इसका उपयोग कुकी मूल्यों को लोड करने के लिए करते हैं, तो आप फिर से क्रॉस-साइट अनुरोध forgeries का जोखिम उठाते हैं

और GET के साथ भी, $_GETटाइप करने के लिए छोटा है $_REQUEST;)


जब मैं आपसे सहमत हूं, मुझे लगता है कि यह नोट करना महत्वपूर्ण है कि यह क्यों सच है और / या खतरनाक है: किसी को इसका उपयोग $_POSTतब करना चाहिए जब यह महत्वपूर्ण हो कि डेटा POSTDATA हो। $_REQUESTजब डेटा HTTP वर्ब के लिए अज्ञेय द्वारा उपयोग किया जाता है, तो उसे उपयोग करना चाहिए । इन सभी मामलों में सभी को सावधानीपूर्वक सभी इनपुट डेटा को साफ करना चाहिए।
डेरेलिज्ड

1
मैं यह नहीं देखता कि डेटा का स्रोत क्रॉस-साइट अनुरोध जालसाजी की संभावना से कैसे संबंधित है। एक हमलावर आपकी साइट पर इंगित POST फॉर्म के साथ उपयोगकर्ता की आपूर्ति करके एक POST पैरामीटर को पूरी तरह से आसानी से सेट कर सकता है; चाहे आपको कोई GET या POST आता है या नहीं, आपको उसी एंटी- XSRF सुरक्षा उपायों की आवश्यकता होगी।
बोबिन्स

जालसाजी के लिए GET का दुरुपयोग करना बहुत आसान है। उदाहरण के लिए, आप बस अपने src सेट के साथ एक img टैग रख सकते हैं जो आप चाहते हैं। यह कभी नहीं था यह जानते हुए भी उपयोगकर्ता के बिना काम करेंगे।
जानी हार्टिकेनन

0

मेरा उपयोग केवल तभी किया जा सकता है यदि आप वर्तमान url या hostname को पुनः प्राप्त करना चाहते हैं, लेकिन वास्तव में उस URL से डेटा को पार्स करने वाले जैसे & प्रतीक का उपयोग करके पार्स करना संभवत: यह एक अच्छा विचार नहीं है। सामान्य तौर पर, आप जो करना चाह रहे हैं उसका अस्पष्ट वर्णन नहीं करना चाहते। यदि आपको विशिष्ट होने की आवश्यकता है, जहां $ _REQUEST खराब है, यदि आपको विशिष्ट होने की आवश्यकता नहीं है, तो इसका उपयोग करने के लिए स्वतंत्र महसूस करें। मैं सोचूंगा।


तुम क्या कहना चाहते हो? आप के $_REQUESTसाथ भ्रमित कर रहे हैं $_SERVER['QUERY_STRING']?
डेरेलिज्ड

0

यदि आप जानते हैं कि आपको कौन सा डेटा चाहिए, तो आपको इसके लिए स्पष्ट रूप से पूछना चाहिए। IMO, GET और POST दो अलग-अलग जानवर हैं और मैं एक अच्छे कारण के बारे में नहीं सोच सकता कि आपको कभी भी पोस्ट डेटा और क्वेरी को मिलाने की आवश्यकता क्यों होगी। अगर किसी के पास एक है, तो मुझे दिलचस्पी होगी।

$ _REQUEST का उपयोग करना तब सुविधाजनक हो सकता है जब आपकी स्क्रिप्ट GET या POST के समान तरीके से प्रतिक्रिया दे सकती है। मैं यह तर्क दूंगा कि यह एक अत्यंत दुर्लभ मामला होना चाहिए, और ज्यादातर उदाहरणों में दो अलग-अलग अवधारणाओं को संभालने के लिए दो अलग-अलग फ़ंक्शन, या बहुत कम से कम विधि की जाँच करना और सही चर का चयन करना पसंद किया जाता है। प्रोग्राम का प्रवाह आमतौर पर पालन करना बहुत आसान होता है, जब यह संदर्भ को पार करने के लिए आवश्यक नहीं होता है, जहां से चर आ सकते हैं। उस व्यक्ति के प्रति दया रखें, जिसे 6 महीने के समय में अपना कोड बनाए रखना है। हो सकता है वो आप हों।

REQUEST चर में कुकीज़ और पर्यावरण चर के कारण सुरक्षा समस्याओं और WTFs के अलावा (मुझे GLOBAL पर आरंभ नहीं करें), विचार करें कि क्या भविष्य में PHP मूल रूप से अन्य तरीकों जैसे PUT और DELETE का समर्थन करना शुरू कर सकता है। हालांकि यह बहुत कम संभावना नहीं है कि ये REQUEST सुपरग्लोबल में विलय हो जाएंगे, लेकिन यह संभव है कि इन्हें चर_ विकल्प सेटिंग में विकल्प के रूप में शामिल किया जा सकता है। इसलिए आपको वास्तव में कोई भी पता नहीं है कि REQUEST क्या रखता है, और क्या पूर्वता ले रहा है, खासकर यदि आपका कोड तीसरे पक्ष के सर्वर पर तैनात है।

क्या GST की तुलना में POST सुरक्षित है? ज़रुरी नहीं। GET का उपयोग करना बेहतर है जहां व्यावहारिक है क्योंकि आपके लॉग में यह देखना आसान है कि जब यह हमला होता है तो आपके आवेदन का किस तरह से शोषण किया जा रहा है। POST उन ऑपरेशनों के लिए बेहतर है जो डोमेन स्थिति को प्रभावित करते हैं क्योंकि मकड़ियाँ आम तौर पर उनका पालन नहीं करती हैं, और जब आप अपने CMS में लॉग इन करते हैं, तो भविष्यवाणियां करने वाला मैकेनिज्म आपके सभी कंटेंट को डिलीट नहीं करेगा। हालाँकि, यह सवाल GET बनाम POST के गुणों के बारे में नहीं था, यह इस बारे में था कि रिसीवर को आने वाले डेटा का इलाज कैसे करना चाहिए और इसे मर्ज करना बुरा क्यों है, इसलिए यह वास्तव में सिर्फ BTW है।


0

मुझे लगता है कि इसमें कोई समस्या नहीं है $_REQUEST, लेकिन इसका उपयोग करते समय हमें सावधान रहना चाहिए क्योंकि यह 3 स्रोतों (जीपीसी) से चर का संग्रह है।

मुझे लगता $_REQUESTहै कि पुराने कार्यक्रमों को नए php संस्करणों के साथ संगत बनाने के लिए अभी भी उपलब्ध है, लेकिन अगर हम नई परियोजनाओं (नई पुस्तकालयों सहित) को शुरू करते हैं, तो मुझे लगता है कि हमें $_REQUESTकार्यक्रमों को स्पष्ट करने के लिए अब और उपयोग नहीं करना चाहिए । हमें $_REQUESTप्रोग्राम को हल्का बनाने के लिए रैपर फ़ंक्शन के उपयोग को हटाने और इसे बदलने पर भी विचार करना चाहिए , विशेष रूप से बड़े सबमिट किए गए टेक्स्ट डेटा को संसाधित करने में, जिसकी $_REQUESTप्रतियां शामिल हैं $_POST

// delete $_REQUEST when program execute, the program would be lighter 
// when large text submitted
unset($_REQUEST);

// wrapper function to get request var
function GetRequest($key, $default = null, $source = '') 
{
  if ($source == 'get') {
    if (isset($_GET[$key])) { 
      return $_GET[$key]; 
    } else { 
      return $default; 
    }
  } else if ($source == 'post') {
    if (isset($_POST[$key])) { 
      return $_POST[$key]; 
    } else { 
      return $default; 
    }
  } else if ($source == 'cookie') {
    if (isset($_COOKIE[$key])) { 
      return $_COOKIE[$key]; 
    } else { 
      return $default; 
    }
  } else {
    // no source specified, then find in GPC
    if (isset($_GET[$key])) {
      return $_GET[$key];     
    } else if (isset($_POST[$key])) {
      return $_POST[$key]; 
    } else if (isset($_COOKIE[$key])) {
      return $_COOKIE[$key]; 
    } else {
      return $default; 
    } 
  }
}

0

डैरेन कुक: "चूंकि php 5.3 डिफ़ॉल्ट php.ini का कहना है कि केवल GET और POST डेटा ही डाले जाते हैं $_REQUESTphp.net/request_order देखें। मैं कुकी डेटा की उम्मीद करते समय सिर्फ इस बैक -कम्पैटिबिलिटी ब्रेक पर लड़खड़ा गया $_REQUESTऔर सोच रहा था कि यह क्यों था ' टी वर्किंग! ”

वाह ... बस मेरी कुछ स्क्रिप्ट्स PHP 5.3 में अपग्रेड होने के कारण काम करना बंद कर दिया था । एक ही काम किया: मान लें कि $_REQUESTवेरिएबल का उपयोग करते समय कुकीज़ सेट हो जाएंगे । उन्नयन के साथ वास्तव में काम करना बंद कर दिया।

मैं अब कुकी मानों को अलग से उपयोग कर रहा हूं $_COOKIE["Cookie_name"]...


-1

केंद्रीय समस्या यह है कि इसमें कुकीज़ शामिल हैं, जैसा कि अन्य ने कहा है।

PHP 7 में आप ऐसा कर सकते हैं:

$request = array_merge($_GET ?? [], $_POST ?? []);

यह कुकी समस्या से बचा जाता है और आपको सबसे कम खाली सरणी देता है और बाद में पूर्वता लेने के साथ $ _GET और $ _POST का सबसे अच्छा विलय करता है। यदि आप क्वेरी स्ट्रिंग के माध्यम से पैरामीटर के URL इंजेक्शन की अनुमति देने से बहुत परेशान नहीं हैं, तो यह काफी सुविधाजनक है।


नीचे चुनने वालों को, कृपया मेरे संपादन के लिए समझाएं।
अमह 15

-2

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


4
$ _POST और $ _GET के बीच सुरक्षा में कोई अंतर नहीं है, इसके अलावा आप एक ब्राउज़र URL बार में एक POST अनुरोध नहीं टाइप कर सकते हैं। हालाँकि कमांड-लाइन cURL अनुरोध को POST का उपयोग करने में केवल 5 सेकंड लगते हैं।
ज़ोम्बैट

3
@ ज़ोम्बैट: हमें लोगों को यह समझाने के लिए किसी तरह का अभियान शुरू करने की आवश्यकता है कि POST GET की तुलना में स्वाभाविक रूप से सुरक्षित नहीं है, या सुरक्षित भी नहीं है। सुरक्षा है कि कैसे आप डेटा का इलाज करते हैं न कि HTTP वर्ब का उपयोग इसे वहां लाने के लिए किया गया था।
डेरेलिज्ड

@Dereleased - मैं इंटरनेट का प्रतिनिधित्व करने के लिए कुछ बिजली के बोल्ट के साथ एक बादल की एक प्रतिष्ठित जोड़ी की टोन तस्वीर पेश करता हूं, जिसके नीचे "CHANGE" शब्द है।
ज़ोम्बैट

1
@GuyT: यह एक बहुत ही संकीर्ण विचार है। यह केवल "सुरक्षित" कैसे है, इसके बारे में नहीं है, लेकिन यह कितना गोपनीय है। जीईटी पैरामीटर ब्राउज़र यूआरएल, यहां तक ​​कि ब्राउज़र इतिहास में ऑटोकोम्प्लीट्स के रूप में दिखा सकते हैं। इसके अलावा, सुरक्षा ब्राउज़र के साथ समाप्त नहीं होती है। उदाहरण के लिए, कई सर्वर http url लॉग करते हैं, इसलिए यूआरएल में कुछ भी लॉग इन होता है, उदाहरण के लिए। लॉग्स में उपयोगकर्ता नाम / पासवर्ड दिखाने से फर्क पड़ता है। सुरक्षित पक्ष पर, हमेशा GET पैरामीटर के रूप में संवेदनशील जानकारी पास करने से बचें।
स्टेन

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