Aviso “Não Acesse Superglobal $ _POST Array Diretamente” no Netbeans 7.4 para PHP

118

Recebi esta mensagem de aviso no Netbeans 7.4 para PHP enquanto estou usando $ _POST , $ _GET , $ _SERVER , ....

Não acesse Superglobal $ _POST Array diretamente

O que isso significa? O que posso fazer para corrigir esse aviso?

Editar: o código de amostra do evento ainda mostra esse aviso.

Kannika
fonte
1
Qual é o código que garante essa mensagem no Netbeans?
TiMESPLiNTER
2
É apenas uma recomendação, você pode desligar nas opções ... e eu diria que não é uma questão de programação!
Matteo Tassinari
1
Eu só quero saber o que esse aviso deseja que eu altere! porque a versão anterior do netbeans não está sendo exibida. Existe outra maneira de obter esses parâmetros? (Quero dizer $ _POST)
Kannika
@MatteoTassinari Eu sei que é apenas a recomendação e sei onde desabilitar, mas o que posso fazer para corrigir sem avisar? Eu acho que meu conhecimento tem limite para receber avisos, mas eu só quero consertar para deixar meu código atualizado com algo novo, porque eu sei que apenas $ _POST vai conseguir enviar esse formulário de postagem. De qualquer forma, obrigado pelo seu comentário: D
Kannika
1
possível duplicata de preocupação
Ankur

Respostas:

92

filter_input(INPUT_POST, 'var_name')em vez de em $_POST['var_name']
filter_input_array(INPUT_POST)vez de$_POST

Homerocker
fonte
6
Você está respondendo à pergunta "o que significa o aviso" ou à pergunta "como removê-lo"? Porque concordo com você, é isso que o aviso significa, mas usando a função o aviso permanece lá. Eu tenho isso agora em um $name = filter_input(INPUT_POST, $_POST["name"]);.
stenci
6
@stenci você está usando $ _POST novamente enquanto deveria fazer algo como $ name = filter_input (INPUT_POST, "name");
Wojciech Sobczyk
16
Bem, o aviso pode desaparecer, mas se você não especificar um filtro, você realmente não corrigirá o problema de segurança que o NetBeans está apontando. Por exemplo, se você está esperando um int, use:filter_input(INPUT_POST, 'var_name', FILTER_SANITIZE_NUMBER_INT)
HoffZ
44
-1: Esta resposta parece meio trivial. nenhuma explicação, o que filter_input faz, nem mesmo um link para php.net/filter_input . Assusta-me que as pessoas simplesmente vejam, usem, pensem que estão escrevendo um código melhor, mas ainda não entendam nada.
IARI
5
Ai, sugerir o uso de uma função de filtro sem um argumento de filtro leva a FILTER_UNSAFE_RAW, que é equivalente a TRUST_ALL_BAD_INPUT
Kzqai
88

Embora um pouco tarde, me deparei com esta pergunta enquanto procurava a solução para o mesmo problema, então espero que possa ser de alguma ajuda ...

Encontrei-me na mesma escuridão que você. Acabei de encontrar este artigo, que explica algumas novas dicas introduzidas no NetBeans 7.4, incluindo esta:

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

A razão pela qual foi adicionado é porque as superglobais geralmente são preenchidas com entradas do usuário, que nunca deveriam ser cegamente confiáveis. Em vez disso, algum tipo de filtragem deve ser feito, e é isso que a dica sugere. Filtre o valor superglobal caso ele tenha algum conteúdo envenenado.

Por exemplo, onde eu tinha:

$_SERVER['SERVER_NAME']

Eu coloquei em vez disso:

filter_input(INPUT_SERVER, 'SERVER_NAME', FILTER_SANITIZE_STRING)

Você tem o documento filter_input e filtros aqui:

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

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

Ricardo Palomares Martínez
fonte
Se você fizer exatamente o que disser, o Netbeans ainda sublinhará as partes "$ _POST" ou "$ _GET" e exibirá a notificação como se ela não estivesse sendo filtrada. Este problema pode ser apenas um bug do Netbeans (na versão 8.1, pelo menos).
user3640967
6

Concordo com os outros respondentes que na maioria dos casos (quase sempre) é necessário higienizar sua entrada.

Mas considere esse código (é para um controlador 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();
}

Não seria muito útil aplicar higienização aqui (embora também não quebrasse nada).

Portanto, siga as recomendações, mas não cegamente - entenda por que elas são a favor :)

Rauni Lillemets
fonte
1

Apenas use

filter_input (INPUT_METHOD_NAME, 'var_name') em vez de $ _INPUT_METHOD_NAME ['var_name'] filter_input_array (INPUT_METHOD_NAME) em vez de $ _INPUT_METHOD_NAME

por exemplo

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

ao invés de

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

E use

    var_dump(filter_input_array(INPUT_SERVER));

ao invés de

    var_dump($_SERVER);

NB: Aplicar a todas as outras variáveis ​​Super Global

Sani Kamal
fonte
0

Aqui está parte de uma linha em meu código que trouxe o aviso no NetBeans:

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

Depois de muita pesquisa e ver como existem zilhões de maneiras de filtrar esse array, descobri um que era simples. E meu código funciona e o NetBeans está feliz:

$p = filter_input(INPUT_GET, 'p');
$page = (!empty($p))
Jim Tippins
fonte