Pergunta

Eu encontrei recentemente um problema de segurança enorme com meu sistema PM que permite aos usuários enviar uma mensagem tanto quanto eles querem com um laço for na barra de endereços. Alguém colocou isso na barra de endereços:

javascript:for(x=0;x<10000;x++){ $('#compose form').submit(); }

E a mensagem foi enviada 1000 vezes para mim e minha caixa de entrada estava cheio da mesma mensagem e meu banco de dados era tão completo que phpMyAdmin estava sendo muito vagaroso.

A minha pergunta é, como posso evitar isso? Este é um importante edição.

Além disso, o formulário é enviado com AJAX.

Editar:

Eu uso o PHP, então como posso evitar isso? Gosto de como eu poderia fazê-lo para onde uma mensagem só podem ser enviadas a cada 5 minutos ou assim e se apresentar mais de uma dentro de 5 minutos ele irá exibir um erro (ou não mostrar qualquer feedback do usuário em tudo e só impedi-lo de ser submetido )?

Foi útil?

Solução

Há uma maneira óbvia para corrigi-lo e as mentiras problema não no lado do cliente -. encontra-se no lado do servidor

Seu script servidor não deve permitir o envio de mensagens muitas vezes - por exemplo. frequentemente do que, digamos, uma vez a cada 10 minutos. Para fazer isso você pode usar o mecanismo sessão no lado do servidor e salvar as informações quando o usuário enviou o e-mail. Se o usuário não enviou um e-mail, você deve também guardar essa informação em sessão -. Distinguir pessoas com sessão habilitado de pessoas com sessão com mobilidade condicionada (e você deve bloquear o último de enviar e-mails a todos)

A sessão maneira deve ser implementada (o código específico) depende da linguagem que você usa para execução de scripts do lado do servidor (PHP, Python, JSP etc.).

Outras dicas

Se alguém tem o conhecimento para fazer isso para você, você provavelmente não pode fazer qualquer coisa no lado do cliente então a única opção que eu diria é que você entrar ou manter uma contagem etc do número de pedidos (talvez para um determinado recurso) e negar o pedido (ou enviar um "ocupado" http código etc) para o usuário particular.

Eu acho que a maneira mais simples seria a de contar as solicitações de um endereço IP específico (isto obviamente tem desvantagens, como vários usuários atrás de um proxy ou NAT etc).

A solução real dependerá de sua linguagem do lado do servidor e servidor web, mas talvez pudesse enquadrar-se uma regra e ver como ele funciona. Algo como 5 solicitações por minuto (ou o que é apropriado para seu uso) por endereço de IP.

Como já foi dito, você tem que implementar a proteção no servidor. Nenhuma quantidade de client-side codificação irá fornecer proteção.

A forma mais comum de proteger um servidor contra esse tipo de abuso é chamado rate limiting. Você decide quantas vezes você quiser um determinado cliente para ser capaz de enviar uma mensagem e você codificar o servidor para ignorar quaisquer mensagens que estão fora desse limite.

Por exemplo, você pode decidir que não mais do que uma mensagem de um minuto e não mais do que duas mensagens a cada 10 minutos e não mais de quatro mensagens por hora irá permitir. Você escolhe o que você acha que parece razoável e você código para que o algoritmo.

Em seu servidor, você tem que ser capaz de identificar o usuário que a mensagem estava vindo (provavelmente através de um cookie de autenticação) e em seu banco de dados, você tem que ser capaz de descobrir quando a última mensagem foi enviado por esse usuário. Você pode até mesmo ser capaz de armazenar em cache essa informação na memória RAM em seu servidor (dependendo de como funciona o seu servidor) para evitar uma pesquisa de banco de dados em cada pedido desde que você só tem que manter informações recentes e você só precisa para otimizar o desempenho sobre os reincidentes ( aqueles que estão tentando abusar do seu servidor e, portanto, apenas recentemente enviado um pedido).

Eu concordo com o que todo mundo está postando sobre a taxa-limitante.

No entanto, isso pode ser muito complicado para implementar no lado do servidor. Especialmente quando você começar a escalar para fora. E, honestamente, se 1000 mensagens feri-lo tão ruim assim - minha sugestão pode se aplicar a você ainda mais.

Em vez de implementar isso você mesmo, você pode querer olhar para um serviço de terceiros para fazer isso por você, como este super procuração serviços web interessantes Apigee

Uma das suas características é, especificamente, estrangulamento taxa API. (Ver link)

enter descrição da imagem aqui

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top