Eu já vi pessoas (que geralmente escrevem um bom código) alterar diretamente a $_POST
matriz com um código como este:
// Add some value that wasn't actually posted
$_POST['last_activity'] = time();
// Alter an existing post value
$_POST['name'] = trim($_POST['name']);
// Our pretend function
// Pass the entire $_POST array as data to work with in the function
// The function update_record() will read only the values we actually need
update_record($_POST);
// ...That sure was easier than creating a new array
// with only the $_POST values we actually need.
Faz sentido que update_record()
não deva acessar diretamente $ _POST, para que possamos passar outras matrizes de dados para ele, por exemplo, mas certamente isso é preguiçoso, com design ruim ou possivelmente errado? No entanto, ainda estamos passando um array válido para update_record()
, então por que criar um novo?
Este não é o ponto da questão, apenas um exemplo de uso. No entanto, ouvi muitas pessoas dizerem que isso não deve ser feito com $_REQUEST
dados, e é uma prática ruim. Mas por que? Parece bastante inofensivo.
Exemplos:
Definir um valor padrão
$_GET
(ou postar) que realmente não existeAdicionando
$_POST
valores que não foram realmente lançados após o envio de um formulárioLimpar diretamente ou filtrar os
$_GET
valores ou chaves da matriz muito cedo no script (saneamento de fallback ... por que não?)Configurando um
$_POST
valor manualmente antes do envio do formulário para preencher uma entrada com um valor padrão (quando a entrada lê$_POST
seu valor padrão; eu fiz isso)Criando seus próprios
$_SERVER
valores? Claro, ei, por que não?E os outros, como
$_COOKIE
e$_SESSION
? Claro que temos que modificar diretamente, certo? Então por que não os outros?
A modificação direta de superglobais nunca deve ser feita ou é aceitável em alguns casos?
Respostas:
Dado que o PHP já está definindo esses superglobais, não acho que seja ruim modificá-los. Em alguns casos, pode ser a melhor maneira de resolver problemas ... principalmente ao lidar com códigos de terceiros que você não pode modificar facilmente. (Eles podem usar
$_GET
diretamente ou assumir que alguma chave existe$_SERVER
etc.)No entanto, de um modo geral, acho que é uma prática ruim quando você está escrevendo seu próprio código. A modificação dos
$_REQUEST
dados com algum filtro dos bastidores executado automaticamente em todas as páginas provavelmente apresentará efeitos colaterais. (Veja todos os problemas que as "aspas mágicas" causaram como prova.)Portanto, se você não fizer isso (filtrar automaticamente os superglobais), o seguinte não trará benefícios:
quando você pode facilmente fazer:
Eu acho que é muito mais claro fazer a distinção em todo o site que
$_POST
e sempre$_GET
são dados não filtrados e não confiáveis, e eles nunca devem ser usados como estão.Ao copiar o valor filtrado para outra variável, você está afirmando que "entendo o que estou fazendo ... filtramos essa entrada e é seguro usá-la".
fonte
$_POST
, higienizando à medida que avança. E com relação a outras pessoas que fazem isso ... bem, muitas pessoas escrevem código PHP muito ruim, mas isso não é desculpa para você também. :)Em geral, sugiro que você não modifique as super globais predefinidas para que fique claro o que são dados higienizados e os dados brutos / não confiáveis.
Outros podem sugerir que, se você limpar os superglobais no início do ciclo de solicitação, não precisará se preocupar com eles em nenhum outro lugar.
Eu sempre os combinava quando você precisava deles com:
ou similar.
Em termos de outras variáveis, é boa prática para não escrever a qualquer um
$_GET
,$_POST
,$_REQUEST
,$_SERVER
ou$_COOKIE
.$_SESSION
no entanto, é diferente porque geralmente você deseja gravar dados na sessão que persistem em diferentes solicitações da sessão.fonte
setcookie
existe, mas recebemos cookies via$_COOKIE
? Além disso, como$_COOKIE
só é definido quando a sessão atual é iniciada e nunca é atualizada, é necessário que você altere / defina cookies nas duas áreas para que as áreas posteriores do código tenham informações atualizadas.Você deveria evitá-lo. Talvez algum tempo você tenha esquecido de higienizar alguma coisa, para recuperar dados perigosos. Se você copiar os dados em uma nova estrutura enquanto estiver limpando
$_POST
demaisOutros scripts adicionais podem assumir que a matriz está intocada e pode reagir curiosa.
fonte
Nunca gostei da ideia de modificar superglobal porque é enganosa. É uma maneira hacky rápida de fazer algo que provavelmente haverá uma maneira melhor de fazer.
Se você alterar o valor de
$_POST
, por exemplo, estará dizendo que o software recebeu dados que não recebeu.O REAL PROBLEMA
Existe uma situação da vida real em que isso se torna um grande problema:
Imagine que você está trabalhando em equipe. Em um mundo ideal, todos usam a mesma sintaxe, mas não vivemos em um mundo ideal. Um desenvolvedor, John, gosta de acessar os dados publicados usando
$_POST
. Ele muda algo nos post vars:Então você tem outro desenvolvedor, Chris, que prefere usar
filter_input
para acessar dados inseridos (por exemplo, GET, POST, SERVIDOR, BOLINHO), pois ele protege o software ao processar dados que o usuário pode adulterar. Em sua parte do software, ele precisa obter o valor postado deranking
. Sua parte do código é DEPOIS de John.No exemplo acima, alterando uma superglobal, você quebrou o PHP. John definiu o valor de
$_POST['ranking']
2 por qualquer motivo, mas agora Chris recebeu um valor de 1Quando não vejo outra maneira de fazer isso:
Trabalhei em um projeto que usava o wordpress como seu blog por trás de um balanceador de carga da AWS. Isso altera o valor de
$_SERVER['remote_address']
. Nesse caso, o outro desenvolvedor não teve escolha a não ser fazer o seguinte:Conclusão
Há quase certamente uma maneira melhor do que mudar superglobais
fonte
Eu acho que a verdadeira pergunta aqui é "por que você deve modificar o tema?". Não vejo nenhum motivo válido para fazê-lo. Se você precisar limpar uma imput, poderá usar uma variável local…
A menos que o código seja curto o suficiente (digamos, com menos de 50 linhas), modificar essas superglobais apenas tornaria seu código mais difícil de manter e entender.
A propósito, você não precisa passar $ _POST para a função, pois é uma matriz superglobal que pode ser acessada mesmo dentro do escopo local de uma função.
fonte
$_POST
dados? A transferência$_POST
faz com que a função desinfete todos os dados.Depois de responder inicialmente a essa pergunta dizendo que não deveria haver motivo para modificar superglobais, estou editando essa resposta com um exemplo de uma época em que decidi.
Atualmente, estou trabalhando em uma tabela de reescrita de URL na qual a
request
coluna direciona o usuário para atarget
coluna correspondente .Por exemplo, um
request
pode serblog/title-here
etarget
pode serblog.php?id=1
.Como
blog.php
está esperando$_GET
variáveis, e eu não quero mudarheader("Location:")
, estou fazendo algo assim:Isso cria uma
$_GET
matriz que contém os parâmetros pretendidos passados pelatarget
coluna.Por fim, eu recomendaria fortemente não modificar superglobais, a menos que você precise .
fonte