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

12

Eu tenho um site que usa chamadas ajax para executar várias funções. Eles fazem com que o navegador da web retorne 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.

Daniel Bingham
fonte
As chamadas ajax são completamente não autenticadas? Você cria sessões para cada um? Existem padrões para o abuso? E o problema é manipulações específicas ou mais a quantidade de carga que ela adiciona ao site?
Artlung
Você pode postar mais detalhes, por favor? O que as chamadas AJAX estão fazendo? O que eles estão manipulando? Quais problemas ocorrem se o script for chamado fora do AJAX?
usar o seguinte
Na verdade, não estou perguntando sobre uma circunstância específica, mas uma solução geral aplicável a muitas circunstâncias. Se existe essa solução, parece que não existe.
Daniel Bingham

Respostas:

12

Eu não acho que exista alguma maneira de fazer isso de forma 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.


fonte
2
+1 .. assim como é impossível impedir que as pessoas salvem cópias locais de qualquer coisa que o navegador exiba. É mais um concurso para ver se você pode fazê-los desistir e seguir para outra coisa antes que eles descubram.
Tim Post
6

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 é 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 puderem "manipular o site" chamando seu script com dados incorretos, você está fazendo errado.

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

DisgruntledGoat
fonte
3

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

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

Fonte

theycallmemorty
fonte
2
bom ponto, assumindo que o agressor não usa ajax ou forja que cabeçalho HTTP
Adam
1

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á-los. 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

digit1001
fonte
+1 para "Bzzt" - que se torna muito mais engraçado no contexto de "Bzzt - obrigado por jogar!" seguido por um lento desaparecer para preto acompanhada de uma proibição três horas executada por um conjunto de cookie na máquina do usuário (eu tenho certeza que deseja obter a mensagem)
danlefree
0

Acho que uma grande parte da sua solução será a taxa de limitação de 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 adequada para as Xsessões, para cada solicitação do ajax, seu JavaScript precisará passar essa chave de volta ou o ajax retornará uma falha. Uma vez que sua página visitas X+1chamadas ajax, forçar o usuário a fazer alguma ação (talvez captcha? Talvez até mesmo algo como um mousemoveou tapevento, dependendo da UA) antes de enviar uma nova chave de sessão para baixo o fio (fora da banda do ajax original), em seguida, reiniciar 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, 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 causar enviando valores ruins.

artlung
fonte