Eu estava tendo esse problema exato, não tenho certeza se a razão abaixo é o que sempre causa esse erro (especificamente no descrito no modo de pergunta), mas esse foi o caso para mim, então eu só queria compartilhar meus pensamentos .
Debian 7 wheezy (7.7), apache 2.2.2
Eu estava fazendo um recurso quando o usuário deveria alterar o status das mensagens como lidas / não lidas, enquanto clicava em um "link", quando ajax estava sendo enviado ao servidor, assim, durante o teste - clicando rapidamente no link para ver se funciona bem (por isso não vai ser 2 pedidos simultâneos de ajax) recebi este erro
Forbidden
You don't have permission to access /messages on this server.
A parte estranha era que antes disso havia alguns pedidos de ajax bem-sucedidos com o caminho normal, incluindo o nome do domínio como http://example.com/messages/changeStatus/11
. O que significa que o código estava ok. Mas, por outro lado, se eu pudesse esperar alguns segundos e tentar de novo, funcionaria bem.
Eu tinha mod-security e mod-evasive instalado, então depois desse erro eu encontrei essas últimas linhas do arquivo /var/log/apache2/modsec_audit.log
.
--ba0f4035-E--
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access /messages/changeStatus/24
on this server.</p>
</body></html>
--ba0f4035-H--
Apache-Error: [file "mod_evasive20.c"] [line 246] [level 3] client denied by server configuration: /home/user_name/www/example/messages, referer: http://example.com/messages
Stopwatch: 1421177262896100 4724 (- - -)
Stopwatch2: 1421177262896100 4724; combined=10, p1=0, p2=0, p3=2, p4=0, p5=7, sr=0, sw=1, l=0, gc=0
Response-Body-Transformed: Dechunked
Producer: ModSecurity for Apache/2.6.6 (http://www.modsecurity.org/).
Server: Apache/2.2.22 (Debian) PHP/5.4.36-0+deb7u1 mod_ssl/2.2.27 OpenSSL/1.0.1h
--ba0f4035-Z--
Fazendo mais pesquisas, pois descobri o erro do log neste artigo. link
assim, mod evasive é o motivo, porque os parâmetros padrão são muito sensíveis, principalmente em /etc/apache2/mods-available/mod-evasive.conf
file por padrão eu tinha essas opções
<ifmodule mod_evasive20.c>
DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 10
DOSLogDir /var/log/mod_evasive
DOSEmailNotify [email protected]
DOSWhitelist 127.0.0.1
</ifmodule>
conforme aprendemos no link acima
MODEV_DOSPageCount - This is the threshhold for the number of requests for the same page (or URI) per page interval. Once the threshhold for that interval has been exceeded, the IP address of the client will be added to the blocking list.
e
MODEV_DOSPageInterval - The interval for the page count threshhold; defaults to 1 second intervals.
Então, de acordo com as opções padrão, se eu fizesse 2 solicitações para o mesmo url durante 1 segundo, ele mostraria o erro 403, e foi o que aconteceu comigo: ASA Eu aumentei o número para 20, não consegui replicar a mensagem de erro.
por outro lado
MODEV_DOSBlockingPeriod The blocking period is the amount of time (in seconds) that a client will be blocked for if they are added to the blocking list. During this time, all subsequent requests from the client will result in a 403 (Forbidden) and the timer being reset (e.g. another 10 seconds). Since the timer is reset for every subsequent request, it is not necessary to have a long blocking period; in the event of a DoS attack, this timer will keep getting reset
então, como podemos ver, depois que DOSBlockingPeriod
time passou, o ip será deletado da lista negra; como eu estou supondo que esta é a razão, que não há IPs proibidos em logs, também que, ao clicar em F5 depois de alguns segundos, funciona bem, como o período bloqueado passou.
Eu também testei isso com longos períodos de bloqueio e pequenos valores de contagem de páginas, principalmente definindo 1000 e 1 respectivamente. Depois de 2-3 pedidos de ajax, ele começou a mostrar 403 e não desapareceu depois de alguns segundos.
Espero que isso ajude alguém.