चेतावनी "PHP के लिए Netbeans 7.4 पर सीधे सुपरग्लोबल $ _POST ऐरे एक्सेस न करें"


118

मुझे यह संदेश Netbeans 7.4 पर PHP के लिए मिला है जबकि मैं $ _POST , $ _GET , $ _SERVER , का उपयोग कर रहा हूं ...।

सुपरग्लोबल $ _POST ऐरे को सीधे एक्सेस न करें

इसका क्या मतलब है? इस चेतावनी को सही करने के लिए मैं क्या कर सकता हूं?

संपादित करें: ईवेंट नमूना कोड अभी भी यह चेतावनी दिखाता है।


1
वह कोड क्या है जो Netbeans में इस संदेश को दर्ज करता है?
TiMESPLiNTER

2
यह सिर्फ एक सिफारिश है, आप इसे विकल्पों में बंद कर सकते हैं ... और मैं कहूंगा कि यह एक प्रोग्रामिंग सवाल नहीं है!
मत्तेओ तानसारी

1
मैं सिर्फ यह जानना चाहता हूं कि यह चेतावनी मुझे क्या बदलना चाहती है! क्योंकि पुराने netbeans संस्करण नहीं दिखा रहा है। क्या उन मापदंडों को प्राप्त करने का एक और तरीका है? (मेरा मतलब है $ _POST)
कन्निका

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

जवाबों:


92

filter_input(INPUT_POST, 'var_name')के बजाय $_POST['var_name']
filter_input_array(INPUT_POST)के बजाय$_POST


6
क्या आप इस सवाल का जवाब दे रहे हैं "चेतावनी का क्या मतलब है" या सवाल पर "इसे कैसे हटाएं"? क्योंकि मैं आपसे सहमत हूं, यही चेतावनी का मतलब है, लेकिन फ़ंक्शन का उपयोग करके चेतावनी वहां रहती है। मैं इसे अभी एक पर है $name = filter_input(INPUT_POST, $_POST["name"]);
स्टेंकी

6
@stenci आप $ _POST का फिर से उपयोग कर रहे हैं जबकि आपको इस $ नाम = filter_input (INPUT_POST, "नाम") जैसा कुछ करना चाहिए;
वोज्शिएक सोबज़िक

16
ठीक है, चेतावनी गायब हो सकती है, लेकिन यदि आप एक फ़िल्टर निर्दिष्ट नहीं करते हैं, तो आप वास्तव में सुरक्षा समस्या को ठीक नहीं करेंगे जो नेटबीन्स इंगित कर रहा है। उदाहरण के लिए, यदि आप एक इंट की उम्मीद कर रहे हैं, तो उपयोग करें:filter_input(INPUT_POST, 'var_name', FILTER_SANITIZE_NUMBER_INT)
हॉफज़

44
-1: यह उत्तर एक प्रकार का तुच्छ लगता है। कोई स्पष्टीकरण नहीं, क्या filter_input करता है, php.net/filter_input का लिंक भी नहीं । यह मुझे भयभीत करता है कि लोग बस इसे देखेंगे, इसका उपयोग करेंगे, उन्हें लगता है कि वे बेहतर कोड लिख रहे हैं लेकिन फिर भी एक बात समझ में नहीं आती है।
IARI

5
ओउ, एक फिल्टर तर्क के बिना एक फिल्टर फ़ंक्शन का उपयोग करने का सुझाव FILTER_UNSAFE_RAW की ओर जाता है, जो TRUST_ALL_BAD_INPUT के बराबर है
Kzqai

88

हालांकि थोड़ी देर हो चुकी है, मैं इस समस्या का समाधान खोजते हुए इस सवाल पर आया हूं, इसलिए मुझे उम्मीद है कि यह किसी भी मदद का हो सकता है ...

खुद को तुमसे ज्यादा उसी अंधेरे में पाया। बस यह लेख मिला, जो नेटबैंस 7.4 में पेश किए गए कुछ नए संकेत बताते हैं, जिसमें यह भी शामिल है:

https://blogs.oracle.com/netbeansphp/entry/improve_your_code_with_new

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

उदाहरण के लिए, जहां मेरे पास था:

$_SERVER['SERVER_NAME']

मैंने इसके बजाय डाल दिया है:

filter_input(INPUT_SERVER, 'SERVER_NAME', FILTER_SANITIZE_STRING)

आपके पास यहां फ़िल्टर_इनपुट और फ़िल्टर डॉक्टर हैं:

http://www.php.net/manual/en/function.filter-input.php

http://www.php.net/manual/en/filter.filters.php


यदि आप जैसा कहते हैं वैसा ही करते हैं, तो Netbeans अभी भी "$ _POST" या "$ _GET" भागों को रेखांकित करेगा और अधिसूचना को प्रदर्शित करेगा जैसे कि इसे फ़िल्टर नहीं किया जा रहा था। यह समस्या सिर्फ एक नेटबीन्स बग (8.1 संस्करण में कम से कम) हो सकती है।
user3640967

6

मैं अन्य उत्तरदाताओं से सहमत हूं कि ज्यादातर मामलों में (लगभग हमेशा) आपके इनपुट को सैनिटाइज करना आवश्यक है।

लेकिन ऐसे कोड पर विचार करें (यह एक REST नियंत्रक के लिए है):

$method = $_SERVER['REQUEST_METHOD'];

switch ($method) {
            case 'GET':
                return $this->doGet($request, $object);
            case 'POST':
                return $this->doPost($request, $object);
            case 'PUT':
                return $this->doPut($request, $object);
            case 'DELETE':
                return $this->doDelete($request, $object);
            default:
                return $this->onBadRequest();
}

यहां सैनिटाइजिंग लागू करना बहुत उपयोगी नहीं होगा (हालांकि यह या तो कुछ भी नहीं तोड़ देगा)।

इसलिए, सिफारिशों का पालन करें, लेकिन आँख बंद करके नहीं - बल्कि यह समझें कि वे क्यों हैं :)


1

महज प्रयोग करें

फ़िल्टर _input (INPUT_METHOD_NAME, 'var_name') $ _INPUT_METHOD_NAME के ​​बजाय ['var_name'] फ़िल्टर_input_array (INPUT_METHOD_NAME) $ _INPUT_METHOD_NAME के ​​बजाय

जैसे

    $host= filter_input(INPUT_SERVER, 'HTTP_HOST');
    echo $host;

के बजाय

    $host= $_SERVER['HTTP_HOST'];
    echo $host;

और उपयोग करें

    var_dump(filter_input_array(INPUT_SERVER));

के बजाय

    var_dump($_SERVER);

NB: अन्य सभी सुपर ग्लोबल वैरिएबल पर लागू करें


0

यहाँ मेरे कोड में एक लाइन का हिस्सा है जो NetBeans में चेतावनी लाया है:

$page = (!empty($_GET['p'])) 

बहुत शोध और देखने के बाद कि इस सरणी को फ़िल्टर करने के बारे में कैसे एक bazillion तरीके हैं, मैंने पाया कि एक सरल था। और मेरा कोड काम करता है और NetBeans खुश है:

$p = filter_input(INPUT_GET, 'p');
$page = (!empty($p))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.