Entre $ _REQUEST, $ _GET e $ _POST, qual é o mais rápido?

177

Qual desses códigos será mais rápido?

$temp = $_REQUEST['s'];

ou

if (isset($_GET['s'])) {
  $temp = $_GET['s'];
}
else {
  $temp = $_POST['s'];
}
kobra
fonte
6
Há um terceiro caso, você sabe. !isset($_REQUEST['s']).
Franz
5
Quão importante é que outras pessoas entendam seu código claramente? POST e GET são explícitos, enquanto PEDIDO pode vir de várias fontes. Penso que a eficiência é insignificante, uma vez que as superglobais REQUEST, POST e GET são sempre carregadas para cada solicitação.
Kevin

Respostas:

273

$_REQUEST, Por padrão, contém o conteúdo $_GET, $_POSTe $_COOKIE.

Mas é apenas um padrão, que depende variables_order; e não tem certeza de que deseja trabalhar com cookies.

Se eu tivesse que escolher, provavelmente não usaria $_REQUEST, e escolheria $_GETou $_POST- dependendo do que meu aplicativo deveria fazer (ou seja, um ou outro, mas não ambos) : de um modo geral:

  • Você deve usar $_GETquando alguém estiver solicitando dados do seu aplicativo.
  • E você deve usar $_POSTquando alguém estiver enviando (inserindo ou atualizando; ou excluindo) dados no seu aplicativo.

De qualquer forma, não haverá muita diferença nas performances: a diferença será insignificante, em comparação com o que o restante do seu script fará.

Pascal MARTIN
fonte
1
Idealmente, você sempre deve poder usar $ _REQUEST. Mas isso, é claro, é apenas um mundo perfeito.
Tyler Carter
2
$ _REQUEST é supostamente (ou pelo menos costumava ser) mais caro do que usar $ _POST e $ _GET diretamente.
Darrell Brogdon
3
+1 para o conceito de que a diferença de desempenho é insignificante e a perspectiva de manutenção é mais importante: $ _GET e $ _POST transmitem significado de uma maneira que $ _REQUEST não pode.
Jon Cram
9
Usar $ _REQUEST não causa XSS / XSRF. Não entender as nuances do XSS / XSRF causa o XSS / XSRF. Contanto que você atenue com tokens, não há problema E você obtém os benefícios de usar $ _REQUEST (todas as suas variáveis ​​estão em uma super global). Na verdade, eu reconstruo o $ _REQUEST antes de usá-lo com base nos outros superglobais por causa de 'variable_order'. Eu processo $ _COOKIE, depois $ _GET e, em seguida, $ _POST. Dessa forma, os vars POST têm a prioridade mais alta e os vars de cookies obtêm a mais baixa, o que me permite corrigir implicitamente vários bugs (por exemplo, Adobe Flash e citações mágicas).
CubicleSoft
seu no nome, Get = get from, Post = post para
Grumpy
32

GET vs. POST

1) GET e POST criam uma matriz (por exemplo, matriz (chave => valor, chave2 => valor2, chave3 => valor3, ...)). Essa matriz contém pares de chave / valor, onde chaves são os nomes dos controles de formulário e valores são os dados de entrada do usuário.

2) GET e POST são tratados como $ _GET e $ _POST. São superglobais, o que significa que eles estão sempre acessíveis, independentemente do escopo - e você pode acessá-los de qualquer função, classe ou arquivo sem precisar fazer nada de especial.

3) $ _GET é uma matriz de variáveis ​​passadas para o script atual através dos parâmetros de URL.

4) $ _POST é uma matriz de variáveis ​​passadas para o script atual através do método HTTP POST.

Quando usar GET?

As informações enviadas de um formulário com o método GET são visíveis para todos (todos os nomes e valores de variáveis ​​são exibidos no URL). O GET também tem limites na quantidade de informações a serem enviadas. A limitação é de cerca de 2000 caracteres. No entanto, como as variáveis ​​são exibidas no URL, é possível marcar a página como favorita. Isso pode ser útil em alguns casos.

GET pode ser usado para enviar dados não sensíveis.

Nota: GET NUNCA deve ser usado para enviar senhas ou outras informações confidenciais!

Quando usar o POST?

As informações enviadas de um formulário com o método POST são invisíveis para outras pessoas (todos os nomes / valores são incorporados no corpo da solicitação HTTP) e não têm limites na quantidade de informações a serem enviadas.

Além disso, o POST suporta funcionalidades avançadas, como o suporte a entradas binárias de várias partes durante o upload de arquivos para o servidor.

No entanto, como as variáveis ​​não são exibidas no URL, não é possível marcar a página como favorita.

Zee Ken
fonte
6
Adicione algo sobre REQUEST também.
Black Mamba
E quanto a $ _REQUEST?
Aamir Kalimi 26/11/19
22

$ _GET recupera variáveis ​​da string de consulta ou do seu URL.>

$ _POST recupera variáveis ​​de um método POST, como (geralmente) formulários.

$ _REQUEST é uma fusão de $ _GET e $ _POST, onde $ _POST substitui $ _GET. É bom usar $ _REQUEST em formulários auto-refrativos para validações.

gewel
fonte
3
+1 Isso é basicamente o que me ensinaram. Não é técnico como outras respostas, mas é muito mais fácil de lembrar ( GETda sequência de consultas, POSTdo envio do formulário).
Jp2code
18

Eu sugiro usar $_POSTe $_GETexplicitamente.

De qualquer forma, o uso de $ _REQUEST deve ser desnecessário com o design adequado do site, e ele vem com algumas desvantagens, como deixar você aberto a CSRF/XSSataques mais fáceis e outras bobagens resultantes do armazenamento de dados no URL.

A diferença de velocidade deve ser mínima de qualquer maneira.

Daniel Bruce
fonte
8

Use PEDIDO. Ninguém se importa com a velocidade de uma operação tão simples, e é um código muito mais limpo.

Steven Schlansker
fonte
7
Boa resposta, com a ressalva de que, em muitas situações, um GET ou um POST deve ser escolhido com base na situação, em vez de usar qualquer um deles.
ceejayoz
3
Você está certo que ninguém se importa, mas na minha opinião usar $_REQUESTé a conclusão errada. Veja minha resposta.
Franz
4
por que usar $ _REQUEST é mais limpo em comparação com $ _GET ou $ _POST? $ _REQUEST executa a mesma lógica nos bastidores e escolher GET ou POST oferece mais controle.
Jay Zeng
6
A alegação de que _REQUEST é mais higiênica precisa de elaboração.
2
Eu recomendo usar GET se você quiser que o usuário possa copiar o URL e realizar a mesma operação, ou seja, (o URL é visível como 'google.com/q=searchWord' enquanto o POST deve ser usado para postar dados em um site que só deve ser inserido uma vez, ou grandes quantidades de dados está ativo e o usuário não deve ser capaz de manter a url como inserir dados em bancos de dados, entrando etc.
Dean Meehan
7

Não se preocupe. Mas você ainda deve usar a segunda solução (mais uma verificação extra para nenhuma dessas variáveis ​​existentes), porque há problemas de segurança com $_REQUEST(desde $_GETe $_POSTnão são as únicas fontes para essa matriz).

Houve um post sobre os problemas de $_REQUESTontem, acredito. Deixe-me ir encontrá-lo.

EDIT : Oh, bem, não diretamente um post, mas aqui está mesmo assim: http://kuza55.blogspot.com/2006/03/request-variable-fixation.html

Franz
fonte
6
if (isset($_GET['s'])) {
  $temp = $_GET['s'];
}
else {
  $temp = $_POST['s'];
}

Use isso porque é mais seguro e não fará diferença de velocidade perceptível

Kristina Brooks
fonte
Não é uma solução ruim. Ele cuida das falhas de segurança associadas, $_REQUESTmas ainda permite que o mesmo script seja acessado de qualquer maneira (no meu caso, o mesmo script é usado com diferentes 'ações' e, algumas vezes, $ _GET ficaria bem, mas outras vezes eu preciso de $ _POST para ocultar / proteger os dados).
Xandor
4

Existem certas preocupações de segurança envolvidas, pois um hacker pode definir um cookie que substituirá um valor $ _POST ou $ _GET. Se você manipular dados confidenciais, eu não recomendaria o uso de $ _REQUEST. - Xandor

você não pode ser usado $_GETalternativamente $_POSTem alguns casos.

Quando ??

  • quando você deseja fazer upload de um arquivo.
  • quando você não quiser mostrar os dados no URL.

GETtambém tem limites na quantidade de informações a serem enviadas. A limitação é de cerca de 2000 caracteres.

Outra coisa é que existem poucos casos em que você não pode recuperar dados usando $_POST

Quando ?

  • quando os dados são passados ​​no URL.

For Rest Service

`GET` - Provides a read only access to a resource.

`PUT` - Used to create a new resource.

não há nada errado em usar $_REQUEST.

Mas a maneira de fazer isso é verificar $ _SERVER ['REQUEST_METHOD'] explicitamente, não confiar que $ _POST esteja vazio para um GET.

Parth Chavda
fonte
1
Bons conselhos sobre como usar $_SERVER['REQUEST_METHOD']para verificar se o script será chamado com qualquer um deles. Mas dizer que nada está errado com isso $_REQUESTnão é 100% verdade. Existem certas preocupações de segurança envolvidas, pois um hacker pode definir um cookie que substituirá um valor $ _POST ou $ _GET. Se você manipular dados confidenciais, eu não recomendaria o uso $_REQUEST.
Xandor 20/07/19
Eu adicionei o seu comentário na minha resposta que s make ajuda obrigado
Parth Chavda
3

$ _GET recupera variáveis ​​da string de consulta ou do seu URL.>

$ _POST recupera variáveis ​​de um método POST, como (geralmente) formulários.

$ _REQUEST é uma fusão de $ _GET e $ _POST, onde $ _POST substitui $ _GET. É bom usar $ _REQUEST em formulários auto-refrativos para validações.

krunal panchal
fonte
2
A substituição depende request_ordere também pode conter valores de cookies, e é por isso que não é um recurso muito confiável nem útil.
Ja͢ck
1

Eu usaria o segundo método, pois é mais explícito. Caso contrário, você não sabe de onde vêm as variáveis.

Por que você precisa verificar tanto o GET quanto o POST? Certamente, usar um ou outro só faz mais sentido.


fonte
1
Já vi isso antes, GETsendo usado apenas para um item (por exemplo, movê-lo) e POSTpara vários deles (um formulário com caixas de seleção ...).
Franz
1

Eu só uso _GET ou _POST. Eu prefiro ter controle.

O que eu não gosto nos fragmentos de código no OP é que eles descartam as informações nas quais o método HTTP foi usado. E essas informações são importantes para a higienização das entradas.

Por exemplo, se um script aceitar dados de um formulário que será inserido no banco de dados, é melhor usar o POST ( use GET apenas para ações idempotentes ). Mas se o script receber os dados de entrada por meio do método GET, deverá (normalmente) ser rejeitado. Para mim, tal situação pode justificar a gravação de uma violação de segurança no log de erros, pois é um sinal de que alguém está tentando algo.

Com qualquer fragmento de código no OP, essa higienização não seria possível.


fonte
Na verdade, é simples escrever uma pequena página que poste o que você quiser em uma página. Portanto, a menos que você confie no envio de cabeçalhos de referência, os post vars não são mais seguros do que os vars. Acho que a maior vantagem de um explícita $_POSTé impedir motor de pesquisa indexadores de fazer algo parecido com isto: thedailywtf.com/Articles/WellIntentioned-Destruction.aspx
Duroth
Eu não disse nada ao contrário. O que eu disse foi que, se o formulário HTML usa POST e o processamento do script recebe os dados do formulário via GET, o script gostaria de saber sobre ele e não descartá-lo, como fazem os exemplos de ambos os kobra. (Btw: referrer não é seguro também.)
1

Eu usaria $_POST, e $_GETporque diferentemente de $_REQUESTseu conteúdo não é influenciado por variables_order.
Quando usar $_POSTe $_GETdepende de que tipo de operação está sendo executada. Uma operação que altera os dados manipulados do servidor deve ser feita através de uma solicitação POST, enquanto as outras operações devem ser feitas através de uma solicitação GET. Para dar um exemplo, uma operação que exclua uma conta de usuário não deve ser executada diretamente após o usuário clicar em um link, enquanto a visualização de uma imagem pode ser feita através de um link.

kiamlaluno
fonte
1

Eu uso isso,

$request = (count($_REQUEST) > 1)?$_REQUEST:$_GET;

a instrução valida se $ _REQUEST possui mais de um parâmetro (o primeiro parâmetro em $ _REQUEST será o URL da solicitação que pode ser usado quando necessário, alguns pacotes PHP não retornarão $ _GET, portanto verifique se mais de 1 vale para $ _GET, por padrão, será $ _POST.

Cosmo Arun
fonte
0

Você está otimizando prematuramente. Além disso, você deve realmente pensar se o GET deve ser usado para as coisas que você está postando, por razões de segurança.

Alex Brasetvik
fonte
3
Por favor, não tente dizer às pessoas que há algo mais seguro no POST do que no GET.
Eu não. A questão era que seus usos deveriam ser pensados ​​e não usados ​​de maneira flagrante, porque "apenas digitar REQUEST é muito mais fácil".
1879 Alex Brasetvik
Se o que você quer dizer é que o kobra deve verificar se os dados foram enviados usando o método esperado, concordo. Qualquer um de seus exemplos de código torna esse teste impossível.
0

É feio e eu não o recomendaria como uma solução final ao colocar o código ao vivo, mas, ao criar funções de descanso, às vezes é útil ter um captador de parâmetros 'catch-all':

public static function parseParams() {
    $params = array();
    switch($_SERVER['REQUEST_METHOD']) {
        case "PUT":
        case "DELETE":
            parse_str(file_get_contents('php://input'), $params);
            $GLOBALS["_{$_SERVER['REQUEST_METHOD']}"] = $params;
            break;
        case "GET":
            $params = $_GET;
            break;
        case "POST":
            $params = $_POST;
            break;
        default:
            $params = $_REQUEST;
            break;
    }
    return $params;
}

Alguém criativo provavelmente poderia até adicionar a ele para lidar com os parâmetros da linha de comando ou o que vier do seu IDE. Depois de decidir o que uma determinada função de descanso está fazendo, você pode escolher uma apropriada para essa chamada para garantir que você obtenha o que precisa para a versão de implantação. Isso pressupõe que 'REQUEST_METHOD' está definido.

Scott
fonte