Ostrzeżenie „Nie uzyskuj bezpośredniego dostępu do tablicy Superglobal $ _POST” w Netbeans 7.4 dla PHP

118

Otrzymałem tę wiadomość z ostrzeżeniem w Netbeans 7.4 dla PHP, gdy używam $ _POST , $ _GET , $ _SERVER , ....

Nie uzyskuj bezpośredniego dostępu do tablicy Superglobal $ _POST

Co to znaczy? Co mogę zrobić, aby poprawić to ostrzeżenie?

Edycja: przykładowy kod zdarzenia nadal wyświetla to ostrzeżenie.

Kannika
źródło
1
Jaki kod zapewnia tę wiadomość w Netbeans?
TiMESPLiNTER
2
To tylko zalecenie, możesz to wyłączyć w opcjach ... i powiedziałbym, że to nie jest kwestia programowania!
Matteo Tassinari
1
Chcę tylko wiedzieć, co to ostrzeżenie ma zmienić! ponieważ starsza wersja netbeans nie jest wyświetlana. Czy jest inny sposób uzyskania tych parametrów? (Mam na myśli $ _POST)
Kannika
@MatteoTassinari Wiem, że to tylko zalecenie i wiem, gdzie je wyłączyć, ale co mogę zrobić, aby poprawić bez ostrzeżenia? Myślę, że moja wiedza ogranicza się do otrzymania ostrzeżenia, ale chcę to naprawić, aby zaktualizować mój kod o nowe rzeczy, ponieważ wiem, że tylko $ _POST otrzyma te formularze wysyłania. W każdym razie, dzięki za komentarz: D
Kannika
1
możliwy duplikat problemu
Ankur

Odpowiedzi:

92

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

Homerocker
źródło
6
Odpowiadasz na pytanie „co oznacza ostrzeżenie” lub na pytanie „jak je usunąć”? Ponieważ zgadzam się z tobą, to właśnie oznacza ostrzeżenie, ale używając funkcji, ostrzeżenie tam pozostaje. Mam to teraz na $name = filter_input(INPUT_POST, $_POST["name"]);.
Stenci
6
@stenci, ponownie używasz $ _POST, podczas gdy powinieneś zrobić coś takiego $ name = filter_input (INPUT_POST, "name");
Wojciech Sobczyk,
16
Cóż, ostrzeżenie może zniknąć, ale jeśli nie określisz filtru, tak naprawdę nie naprawisz problemu bezpieczeństwa, na który wskazuje NetBeans. Na przykład, jeśli spodziewasz się int, wpisz:filter_input(INPUT_POST, 'var_name', FILTER_SANITIZE_NUMBER_INT)
HoffZ
44
-1: Ta odpowiedź wydaje się banalna. bez wyjaśnienia, co robi filter_input , nawet nie ma linku do php.net/filter_input . Przeraża mnie, że ludzie po prostu to zobaczą, wykorzystają, pomyślą, że piszą lepszy kod, ale nadal nic nie rozumieją.
IARI
5
Ow, sugerowanie użycia funkcji filtrującej bez argumentu filtru prowadzi do FILTER_UNSAFE_RAW, co jest równoważne TRUST_ALL_BAD_INPUT
Kzqai
88

Chociaż trochę się spóźniłem, natknąłem się na to pytanie, szukając rozwiązania tego samego problemu, więc mam nadzieję, że może być jakakolwiek pomoc ...

Znalazłem się w tej samej ciemności co ty. Właśnie znalazłem ten artykuł, który wyjaśnia kilka nowych wskazówek wprowadzonych w NetBeans 7.4, w tym ten:

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

Powodem, dla którego został dodany, jest to, że superglobale są zwykle wypełnione danymi wejściowymi użytkownika, czemu nigdy nie należy ślepo ufać. Zamiast tego należy wykonać jakieś filtrowanie i to właśnie sugeruje podpowiedź. Filtruj wartość superglobalną w przypadku, gdy zawiera zatrutą zawartość.

Na przykład, gdy miałem:

$_SERVER['SERVER_NAME']

Zamiast tego wstawiłem:

filter_input(INPUT_SERVER, 'SERVER_NAME', FILTER_SANITIZE_STRING)

Masz dokument filter_input i filter tutaj:

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

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

Ricardo Palomares Martínez
źródło
Jeśli zrobisz dokładnie to, co powiesz, Netbeans nadal będzie podkreślać części „$ _POST” lub „$ _GET” i wyświetlać powiadomienie tak, jakby nie było filtrowane. Ten problem może być po prostu błędem Netbeans (przynajmniej w wersji 8.1).
user3640967,
6

Zgadzam się z innymi osobami odpowiadającymi, że w większości przypadków (prawie zawsze) konieczne jest oczyszczenie Twojego wkładu.

Ale rozważ taki kod (dotyczy kontrolera 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();
}

Nie byłoby tu zbyt użyteczne stosowanie środków odkażających (chociaż też niczego by nie zepsuło).

Więc postępuj zgodnie z zaleceniami, ale nie na ślepo - raczej zrozum, dlaczego są dla :)

Rauni Lillemets
źródło
1

Po prostu użyj

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

na przykład

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

zamiast

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

I użyć

    var_dump(filter_input_array(INPUT_SERVER));

zamiast

    var_dump($_SERVER);

NB: Zastosuj do wszystkich innych zmiennych Super Global

Sani Kamal
źródło
0

Oto część wiersza w moim kodzie, który wywołał ostrzeżenie w NetBeans:

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

Po wielu badaniach i przekonaniu się, że istnieje około miliardów sposobów filtrowania tej tablicy, znalazłem taki, który był prosty. Mój kod działa, a NetBeans jest zadowolony:

$p = filter_input(INPUT_GET, 'p');
$page = (!empty($p))
Jim Tippins
źródło