desenv-web-rp.com

Como impedir que um usuário avançado chame minhas funções ajax?

Eu tenho um site que usa chamadas ajax para executar várias funções. Eles têm o navegador da web chamado de volta para um script - ajax.php. Embora eu use dados de postagem para transmitir os dados e limitar os comandos que o script ajax pode chamar, não há realmente nada impedindo os usuários de falsificar chamadas ajax para tentar manipular o site. Existe alguma maneira geral de impedir que os usuários falsifiquem as chamadas? Existe uma maneira de garantir que uma chamada ajax realmente venha do meu site e não de algum outro script ou site?

Ou eu simplesmente tenho que verificar as condições de contorno no script php e impedir que os usuários falsifiquem coisas que eles não teriam permissão para fazer, mas permitam que eles falsifiquem onde seriam permitidos.

12
Daniel Bingham

Eu não acho que exista alguma maneira de fazer isso de maneira confiável, pois qualquer informação que você possa enviar pode ser falsificada, dependendo da inteligência do usuário.

Se você quiser apenas um bloco simples de pessoas que não ligam da sua página, verifique o referenciador, use um cookie ou adicione um campo oculto aleatório enviado pela página de chamada que expira após um certo tempo. Mas estes são fáceis de falsificar se o usuário é realmente determinado.

12
delete

Em suma, não. Qualquer solicitação feita a um URL por meio de GET ou POST pode ser feita por qualquer pessoa que utilize qualquer software. Na verdade, uma solicitação AJAX não é realmente diferente de carregar o URL diretamente, exceto com o último, os dados retornados são exibidos no navegador como uma página da web.

Essa é exatamente a razão pela qual você deve sempre validar os dados enviados no servidor, independentemente de fazer ou não uma validação Javascript.

Não está claro exatamente o que o script do lado do servidor está fazendo e o que pode dar errado, mas se os usuários conseguirem "manipular o site" chamando seu script com dados incorretos, você está fazendo errado.

Provavelmente, a melhor solução será a introdução de alguma forma de autenticação.

6
DisgruntledGoat

Então, basicamente, você deseja limitar o ajax.php a responder apenas a solicitações AJAX?

Eu não sou especialista em php, mas parece possível determinar se uma determinada solicitação vem de AJAX ou uma solicitação "regular" do navegador, verificando o valor de $_SERVER['HTTP_X_REQUESTED_WITH'].

Origem

3
theycallmemorty

Como alguém apontou ... as chamadas ajax são apenas receptores de $ _GET ou $ _POST, então minha abordagem sempre foi apenas tratá-las como faria com qualquer página de ação e filtrar/higienizar a entrada. Se você tem uma pequena variação do que espera de um mês, por exemplo, e sabe que sempre está no formato "Jan, Feb, Mar ...", você pode definir uma matriz dos valores esperados e filtrá-la. Prenda qualquer coisa que não corresponda e, opcionalmente, jogue algo como "Bzzt ... obrigado por jogar ..."

Não consigo pensar em um exemplo em que meu script Ajax precisaria ser mais seguro do que um envio de formulário.

HTH

1
digit1001

Acho que uma grande parte da sua solução será taxa limite tráfego de uma impressão digital de usuário específica. Talvez um hash de endereço IP, sequência do agente do usuário e os dados que estão sendo enviados.

Além disso, vincular a página que chama o ajax aos dados retornados pelo ajax mais perto pode ser útil. Portanto, na página em questão, no carregamento da página, envie uma chave de sessão válida para sessões X, para cada solicitação de ajax, seu JavaScript precisará repassar essa chave ou o ajax retornará uma falha. Depois que sua página clicar em X+1 chamadas do ajax, force o usuário a executar alguma ação (talvez captcha? Talvez até algo como um evento mousemove ou tap dependendo do UA) antes de enviar uma nova sessão pressione o fio (fora da banda do ajax original) e reinicie o processo.

Embora, enquanto eu penso sobre isso, é possível que talvez parte do seu problema seja uma validação negligente dos parâmetros enviados. Se as pessoas puderem apenas brincar com os parâmetros enviados e receber dados válidos, isso será mais difícil. Como fazer isso depende de que tipo de valores estão sendo enviados pelo cliente e que tipo de dano que um mau ator pode fazer enviando valores ruins.

0
artlung