Avviso "Non accedere direttamente all'array $ _POST di Superglobal" su Netbeans 7.4 per PHP


118

Ho ricevuto questo messaggio di avviso su Netbeans 7.4 per PHP mentre utilizzo $ _POST , $ _GET , $ _SERVER , ....

Non accedere direttamente all'array Superglobal $ _POST

Cosa significa? Cosa posso fare per correggere questo avviso?

Modifica: il codice di esempio dell'evento mostra ancora questo avviso.


1
Qual è il codice che assicura questo messaggio in Netbeans?
TiMESPLiNTER

2
È solo una raccomandazione, puoi disattivarla nelle opzioni ... e direi che questa non è una domanda di programmazione!
Matteo Tassinari

1
Voglio solo sapere cosa questo avvertimento vuole che io modifichi! perché la versione precedente di netbeans non viene visualizzata. C'è un altro modo per ottenere questi parametri? (Intendo $ _POST)
Kannika

@MatteoTassinari so che è solo il consiglio e so dove disabilitarlo, ma cosa posso fare per correggerlo senza alcun preavviso? Penso che la mia conoscenza abbia dei limiti per ricevere avvisi, ma voglio solo aggiustarlo per rendere il mio codice aggiornato con nuove cose perché so che solo $ _POST riceverà il modulo di pubblicazione inviato. Comunque, grazie per il tuo commento: D
Kannika

1
possibile duplicato del problema
Ankur

Risposte:


92

filter_input(INPUT_POST, 'var_name')invece di $_POST['var_name']
filter_input_array(INPUT_POST)invece di$_POST


6
Stai rispondendo alla domanda "cosa significa l'avvertimento" o alla domanda "come rimuoverlo"? Perché sono d'accordo con te, questo è ciò che significa l'avviso, ma usando la funzione l'avviso rimane lì. Ce l'ho adesso su un file $name = filter_input(INPUT_POST, $_POST["name"]);.
stenci

6
@stenci stai usando di nuovo $ _POST mentre dovresti fare qualcosa del genere $ name = filter_input (INPUT_POST, "name");
Wojciech Sobczyk

16
Bene, l'avviso potrebbe scomparire, ma se non specifichi un filtro, non risolverai davvero il problema di sicurezza che NetBeans indica. Ad esempio, se ti aspetti un int, utilizza:filter_input(INPUT_POST, 'var_name', FILTER_SANITIZE_NUMBER_INT)
HoffZ

44
-1: questa risposta sembra un po 'banale. nessuna spiegazione, cosa fa filter_input, nemmeno un collegamento a php.net/filter_input . Mi spaventa che le persone lo vedano, lo usino, pensino di scrivere un codice migliore ma ancora non capiscano nulla.
IARI

5
Ow, suggerire l'uso di una funzione di filtro senza un argomento di filtro porta a FILTER_UNSAFE_RAW, che è equivalente a TRUST_ALL_BAD_INPUT
Kzqai

88

Anche se un po 'in ritardo, mi sono imbattuto in questa domanda mentre cercavo la soluzione per lo stesso problema, quindi spero che possa essere di qualche aiuto ...

Mi sono ritrovato nella stessa oscurità di te. Ho appena trovato questo articolo, che spiega alcuni nuovi suggerimenti introdotti in NetBeans 7.4, incluso questo:

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

Il motivo per cui è stato aggiunto è perché le superglobali di solito sono riempite con l'input dell'utente, che non dovrebbe mai essere ciecamente attendibile. Invece, dovrebbe essere fatto un qualche tipo di filtro, ed è quello che suggerisce il suggerimento. Filtra il valore superglobale nel caso abbia contenuto avvelenato.

Ad esempio, dove avevo:

$_SERVER['SERVER_NAME']

Ho messo invece:

filter_input(INPUT_SERVER, 'SERVER_NAME', FILTER_SANITIZE_STRING)

Hai il filter_input e i documenti dei filtri qui:

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

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


Se fai esattamente quello che dici, Netbeans sottolineerà comunque le parti "$ _POST" o "$ _GET" e visualizzerà la notifica come se non fosse filtrata. Questo problema potrebbe essere solo un bug di Netbeans (almeno nella versione 8.1).
user3640967

6

Concordo con gli altri rispondenti che nella maggior parte dei casi (quasi sempre) è necessario sanificare il Tuo input.

Ma considera tale codice (è per un controller 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();
}

Non sarebbe molto utile applicare qui la sanificazione (anche se non romperebbe nulla).

Quindi, segui le raccomandazioni, ma non ciecamente, piuttosto capisci perché sono per :)


1

Basta usare

filter_input (INPUT_METHOD_NAME, 'var_name') invece di $ _INPUT_METHOD_NAME ['var_name'] filter_input_array (INPUT_METHOD_NAME) invece di $ _INPUT_METHOD_NAME

per esempio

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

invece di

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

E usa

    var_dump(filter_input_array(INPUT_SERVER));

invece di

    var_dump($_SERVER);

NB: Applicare a tutte le altre variabili Super Global


0

Ecco parte di una riga nel mio codice che ha portato l'avviso in NetBeans:

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

Dopo molte ricerche e vedendo come ci sono circa un miliardo di modi per filtrare questo array, ne ho trovato uno semplice. E il mio codice funziona e NetBeans è felice:

$p = filter_input(INPUT_GET, 'p');
$page = (!empty($p))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.