Eu vi uma série de posts aqui dizendo para não usar a $_REQUEST
variável. Normalmente não, mas às vezes é conveniente. O que há de errado com isso?
php
methods
form-submit
sprugman
fonte
fonte
$_REQUEST
. Consulte php.net/request_order Acabei de descobrir essa quebra de compatibilidade com versões anteriores ao esperar que os dados do cookie estivessem$_REQUEST
e me perguntando por que não estava funcionando! Portanto, a maior razão para evitar o uso de $ _REQUEST é agora que seu script não pode se auto-definirrequest_order
(éPHP_INI_PERDIR
), então uma mudança no php.ini pode facilmente quebrar as suposições sobre as quais seu script foi construído. Melhor colocar essas suposições diretamente em seu script.Respostas:
Não há absolutamente nada de errado em receber informações de ambos
$_GET
e$_POST
de uma forma combinada. Na verdade, é isso que você quase sempre deseja fazer:para uma solicitação idempotente simples geralmente enviada via GET, existe a possibilidade de que a quantidade de dados que você deseja não caiba em uma URL, então ela foi transformada em uma solicitação POST em vez de uma questão prática.
para uma solicitação que tenha um efeito real, você deve verificar se ela foi enviada pelo método POST. Mas a maneira de fazer isso é verificar
$_SERVER['REQUEST_METHOD']
explicitamente, não depender de$_POST
estar vazio para obter um GET. E de qualquer maneira, se o método forPOST
, você ainda pode querer tirar alguns parâmetros de consulta do URL.Não, o problema
$_REQUEST
não tem nada a ver com a combinação dos parâmetros GET e POST. É que também, por padrão, inclui$_COOKIE
. E os cookies realmente não são como parâmetros de envio de formulário: você quase nunca quer tratá-los como a mesma coisa.Se você acidentalmente obtiver um conjunto de cookies em seu site com o mesmo nome de um de seus parâmetros de formulário, os formulários que dependem desse parâmetro pararão de funcionar de maneira misteriosa devido aos valores de cookie substituindo os parâmetros esperados. Isso é muito fácil de fazer se você tiver vários aplicativos no mesmo site e pode ser muito difícil de depurar quando você tem apenas alguns usuários com cookies antigos que você não usa mais perambulando e quebrando os formulários de maneiras não - outra pessoa pode se reproduzir.
Você pode mudar este comportamento para uma ordem muito mais sensata
GP
(nãoC
) com a configuração request_order no PHP 5.3. Onde isso não for possível, eu pessoalmente evitaria$_REQUEST
e, se eu precisasse de um array combinado GET + POST, crio-o manualmente.fonte
a="foo"
e $ _COOKIEa="bar"
, então haverá alguma substituição / conflito aqui?Tenho vasculhado alguns posts de newsgroups sobre PHP Internals e encontrei uma discussão interessante sobre o tópico. O tópico inicial era sobre outra coisa, mas uma observação de Stefan Esser, um (se não o ) especialista em segurança no mundo do PHP direcionou a discussão para as implicações de segurança do uso de $ _REQUEST para alguns posts.
Citando Stefan Esser sobre PHP Internals
e em uma resposta posterior ao mesmo tópico
A discussão continua por mais algumas postagens e é interessante de ler.
Como você pode ver, o principal problema com $ _REQUEST não é tanto que ele possui dados de $ _GET e $ _POST, mas também de $ _COOKIE. Alguns outros caras da lista sugeriram alterar a ordem em que $ _REQUEST é preenchido, por exemplo, preenchendo-o com $ _COOKIE primeiro, mas isso pode levar a vários outros problemas potenciais, por exemplo, com o manuseio de sessões .
Você poderia omitir completamente $ _COOKIES do $ _REQUEST global, de modo que não seja sobrescrito por qualquer um dos outros arrays (na verdade, você pode limitá-lo a qualquer combinação de seu conteúdo padrão, como o manual do PHP na configuração de variable_order ini diga-nos:
Mas, novamente, você também pode considerar não usar $ _REQUEST completamente, simplesmente porque no PHP você pode acessar Environment, Get, Post, Cookie e Server em seus próprios globais e ter um vetor de ataque a menos. Você ainda precisa limpar esses dados, mas é uma coisa a menos com que se preocupar.
Agora você deve estar se perguntando, por que $ _REQUEST existe afinal e por que não foi removido. Isso também foi perguntado no PHP Internals. Citando Rasmus Lerdorf sobre Por que $ _REQUEST existe? em PHP Internals
De qualquer forma, espero que lance alguma luz.
fonte
$_REQUEST
refere-se a todos os tipos de solicitações (GET, POST etc.). Isso às vezes é útil, mas geralmente é melhor especificar o método exato ($ _GET, $ _POST etc).fonte
$_REQUEST
geralmente é considerado prejudicial pelo mesmo motivo que as transformações de dados de complexidade simples para média costumam ser realizadas no código do aplicativo em vez de declaradas em SQL: alguns programadores são péssimos.Como tal, se alguém tende a usar em
$_REQUEST
qualquer lugar, posso fazer qualquer coisa via GET via POST, o que significa configurar<img>
tags no meu site (malicioso) que fazem com que os usuários logados em seu módulo de e-commerce comprem produtos silenciosamente, ou eu pode fazer com que cliquem em links que resultarão em ações perigosas ou na revelação de informações confidenciais (provavelmente para mim).No entanto, isso ocorre porque um programador PHP novato, ou pelo menos inexperiente, comete erros simples. Em primeiro lugar, saiba quando os dados de que tipo são apropriados. Por exemplo, tenho um serviço da web que pode retornar respostas em URLEncoding, XML ou JSON. O aplicativo decide como formatar a resposta verificando o cabeçalho HTTP_ACCEPT, mas pode ser forçado a formar um especificamente enviando o
format
parâmetro.Ao verificar o conteúdo do parâmetro de formato, ele pode ser enviado via querystring ou um postdata, dependendo de uma infinidade de fatores, entre os quais se os aplicativos de chamada querem ou não "& format = json" misturado com sua solicitação. Neste caso,
$_REQUEST
é muito conveniente porque evita que eu tenha que digitar algo assim:Não vou divagar muito mais, mas basta dizer que
$_REQUEST
uso não é dissuadido porque é inerentemente perigoso - é apenas outra ferramenta que faz exatamente o que é pedido, quer você entenda essas implicações ou não - é o decisão pobre, preguiçosa ou desinformada de um programador pobre, preguiçoso ou inexperiente que causa este problema.Como usar
$_REQUEST
com segurançaaddslashes()
ou*_escape_string()
. Vai mostrar para o usuário?htmlentities()
ouhtmlspecialchars()
. Esperando dados numéricos?is_numeric()
ouctype_digit()
. Na verdade,filter_input()
e suas funções relacionadas são projetadas para fazer nada além de verificar e higienizar dados. Use essas ferramentas, sempre.$post_clean
. Como alternativa, você pode simplesmente limpar diretamente nas superglobais, mas o motivo pelo qual defendo o uso de uma variável separada é porque isso facilita a localização de vulnerabilidades no código, já que qualquer coisa que aponte diretamente para uma superglobal e não seu equivalente sanitizado é considerado um erro perigoso .Em conclusão, lembre-se desta regra simples:
SEGURANÇA É O QUE VOCÊ FAZ, GENTE!
EDITAR:
Eu recomendo fortemente o conselho de bobince: se você puder, defina o
request_order
parâmetro em php.ini para "GP"; ou seja, nenhum componente de cookie. Quase não há raciocínio racional para isso em mais de 98% dos casos, pois os dados do cookie quase nunca devem ser considerados comparáveis à string de consulta ou aos pós-dados.PS, anedota!
Conheci um programador que pensou em
$_REQUEST
um lugar para simplesmente armazenar dados que fossem acessíveis de forma superglobal. Nomes de usuário e senhas importantes, caminhos para arquivos, você nomeia e ele foi armazenado em$_REQUEST
. Ele ficou um pouco surpreso (embora não comicamente, infelizmente) quando eu disse a ele como essa variável se comporta. Desnecessário dizer que essa prática foi deposta.fonte
As solicitações GET devem ser idempotentes e as solicitações POST geralmente não são. Isso significa que dados
$_GET
e$_POST
geralmente devem ser usados de diferentes maneiras.Se seu aplicativo estiver usando dados de
$_REQUEST
, ele se comportará da mesma forma para solicitações GET e POST, o que viola a idempotência de GET.fonte
É vago. Você não sabe realmente como os dados chegaram até você, pois carregam dados de postagem, obtenção e cookie. Não necessariamente acho que isso é sempre uma coisa ruim, a menos que você precise saber ou restringir o método de entrega.
fonte
Na verdade, gosto de usar. Dá-lhe a flexibilidade de usar GET ou POST, o que pode ser útil para coisas como formulários de pesquisa em que a maior parte do tempo os dados são POSTADOS, mas às vezes você vai querer dizer link para uma pesquisa particular, então você pode usar parâmetros GET. .
Além disso, se você olhar para muitas outras linguagens (ASP.NET, por exemplo), elas não fazem distinção alguma entre as variáveis GET e POST.
ETA :
Eu nunca usei REQUEST para obter os valores COOKIE, mas acho que Kyle Butt enfatiza isso nos comentários deste post. NÃO é uma boa ideia usar REQUEST para obter os valores COOKIE. Eu acredito que ele está certo ao dizer que existe um potencial real para falsificação de solicitação entre sites se você fizer isso.
Além disso, a ordem em que as coisas são carregadas no REQUEST é controlada pelos parâmetros de configuração no php.ini (variables_order e request_order). Então, se você tiver a mesma variável passada via POST e GET, qual delas realmente entra em REQUEST depende dessas configurações ini. Isso pode afetar a portabilidade se você depender de um pedido específico e essas configurações forem configuradas de maneira diferente do que você espera.
fonte
É importante entender quando usar POST, quando usar GET e quando usar um cookie. Com $ _REQUEST, o valor que você está procurando pode ter vindo de qualquer um deles. Se você espera obter o valor de um POST ou GET ou de um COOKIE, é mais informativo para alguém que está lendo seu código usar a variável específica em vez de $ _REQUEST.
Alguém também apontou que você não deseja que todos os POSTs ou cookies sejam substituídos por GETs porque existem diferentes regras entre sites para todos eles, por exemplo, se você retornar dados ajax enquanto usa $ _REQUEST, você está vulnerável a um ataque de script entre sites.
fonte
A única vez que usar
$_REQUEST
não é uma má ideia é com GET.E mesmo com GET,
$_GET
é mais curto para digitar do que$_REQUEST
;)fonte
$_POST
quando for importante que os dados sejam POSTDATA. Deve-se usar$_REQUEST
quando os dados são agnósticos ao verbo HTTP usado. Em todos esses casos, deve-se limpar cuidadosamente todos os dados de entrada.Eu posso ser usado apenas se você quiser recuperar o url ou nome do host atual, mas para realmente analisar dados desse URL, como parâmetros usando o símbolo &, provavelmente não é uma boa ideia. Em geral, você não deseja usar uma descrição vaga do que está tentando fazer. Se você precisar ser específico, é aí que $ _REQUEST é ruim, se você não precisar ser específico, sinta-se à vontade para usá-lo. Eu pensaria.
fonte
$_REQUEST
com$_SERVER['QUERY_STRING']
?Se você sabe quais dados deseja, deve solicitá-los explicitamente. IMO, GET e POST são dois animais diferentes e não consigo pensar em uma boa razão para você precisar misturar dados de postagem e strings de consulta. Se alguém tiver um, estou interessado.
Pode ser conveniente usar $ _REQUEST quando seus scripts podem responder a GET ou POST da mesma maneira. Eu argumentaria, porém, que este deve ser um caso extremamente raro e, na maioria dos casos, duas funções separadas para lidar com dois conceitos separados, ou pelo menos verificar o método e selecionar as variáveis corretas, é o preferido. O fluxo do programa geralmente é muito mais fácil de seguir quando não é necessário cruzar a referência de onde as variáveis podem estar vindo. Seja gentil com a pessoa que precisa manter seu código em 6 meses. Pode ser você.
Além dos problemas de segurança e WTFs causados por cookies e variáveis de ambiente na variável REQUEST (não me faça começar no GLOBAL), considere o que pode acontecer no futuro se o PHP começar a suportar nativamente outros métodos, como PUT e DELETE. Embora seja extremamente improvável que eles sejam mesclados na superglobal REQUEST, é possível que eles possam ser incluídos como uma opção na configuração variable_order. Portanto, você realmente não tem ideia do que REQUEST contém e do que está tendo precedência, principalmente se seu código for implantado em um servidor de terceiros.
O POST é mais seguro do que o GET? Na verdade não. É melhor usar GET onde for prático, porque é mais fácil ver em seus logs como seu aplicativo está sendo explorado quando é atacado. O POST é melhor para operações que afetam o estado do domínio porque os spiders geralmente não os seguem, e os mecanismos de busca preditiva não excluirão todo o seu conteúdo quando você efetuar login no CMS. No entanto, a questão não era sobre os méritos de GET vs POST, era sobre como o receptor deveria tratar os dados recebidos e por que é ruim mesclá-los, então este é realmente apenas um BTW.
fonte
Eu acho que não há problema com
$_REQUEST
, mas devemos ter cuidado ao usá-lo, pois é uma coleção de variáveis de 3 fontes (GPC).Acho que
$_REQUEST
ainda está disponível para fazer programas antigos compatíveis com novas versões de php, mas se começarmos novos projetos (incluindo novas bibliotecas), acho que não devemos usar$_REQUEST
mais para tornar os programas mais claros. Devemos até mesmo considerar a exclusão de usos de$_REQUEST
e substituí-los por uma função wrapper para tornar o programa mais leve, especialmente no processamento de grandes dados de texto enviados, uma vez que$_REQUEST
contém cópias de$_POST
.fonte
Uau ... alguns dos meus scripts pararam de funcionar por causa de uma atualização para o PHP 5.3 . Fez a mesma coisa: suponha que os cookies seriam definidos ao usar a
$_REQUEST
variável. Com a atualização exatamente isso parou de funcionar.Agora chamo os valores dos cookies separadamente usando
$_COOKIE["Cookie_name"]
...fonte
O problema central é que contém cookies, como já foi dito.
No PHP 7, você pode fazer isso:
Isso evita o problema dos cookies e, na pior das hipóteses, dá a você um array vazio e, na melhor das hipóteses, uma fusão de $ _GET e $ _POST com o último tendo precedência. Se você não está muito preocupado em permitir a injeção de parâmetros de URL por meio da string de consulta, é bastante conveniente.
fonte
É muito inseguro. Além disso, é estranho, pois você não sabe se está recebendo um POST ou GET ou outra solicitação. Você realmente deve saber a diferença entre eles ao projetar seus aplicativos. GET é muito inseguro, pois é passado na URL e não é adequado para quase nada além da navegação na página. O POST, embora não seja seguro por si só, fornece um nível de segurança.
fonte