.htaccess código para bloquear UserAgents contendo Windows 2001-2009 em nomes

1

Estou tentando bloquear useragents que contêm os seguintes nomes:

Windows 2001
Windows 2002
Windows 2003
Windows 2004
Windows 2005
Windows 2006
Windows 2007
Windows 2008
Windows 2009

Vou usar o seguinte código em .htaccess file:

RewriteCond %{HTTP_USER_AGENT} .*Windows\ 200[1-9].* [NC]
RewriteRule ^(.*)$ - [F,L]

O código acima está correto ou há alguma outra forma correta do código para fazer isso?

    
por TSA 21.09.2017 / 14:54

1 resposta

1
RewriteCond %{HTTP_USER_AGENT} .*Windows\ 200[1-9].* [NC]
RewriteRule ^(.*)$ - [F,L]

O que você tem que funcionar OK. Poderia ser arrumado um pouco ...

RewriteCond %{HTTP_USER_AGENT} Windows\ 200[1-9] [NC]
RewriteRule ^ - [F]

Supondo que você já tenha uma diretiva RewriteEngine On em algum lugar. Ou, alguns podem preferir mostrar explicitamente o espaço em branco usando a classe de caractere abreviada \s em vez de um espaço com escape \ , pois os espaços podem ser difíceis de ler (e difíceis de escrever aqui!). Alternativamente, cite o CondPattern em vez de escapar do espaço. Por exemplo:

RewriteCond %{HTTP_USER_AGENT} "Windows 200[1-9]" [NC]

Tudo o que funciona para você.

Com regex, você não precisa de .* antes e depois de um padrão se quiser expressar que o user-agent contém o padrão. Esse é o comportamento padrão do regex. E se você usar o sinalizador F , não precisará do sinal L - está implícito. E não é necessário capturar o RewriteRule se não estiver sendo usado. Então, em vez de ^(.*)$ , você pode simplesmente escrever .* ou ^ (minha preferência).

Se a string que está sendo correspondida é sempre "Windows" (com um "W" maiúsculo e minúscula para o resto), então você não precisa do NC flag.

ATUALIZAÇÃO:

what's the difference between ^(.*)$, .* and ^ in using in RewriteRule statement?

^(.*)$ - explicitamente captura tudo entre o início e o final da string (URL-path) e salva isso na $1 backreference a ser usada posteriormente (se você desejar). ^ é a âncora do início da string e $ é o final da âncora da string.

.* - corresponde a tudo . Qualquer caractere 0 ou mais vezes.

^ - Este é simplesmente um começo de âncora de string, então ele corresponde a qualquer coisa .

No RewriteRule acima, não nos importamos com o URL solicitado, estamos interessados apenas no User-Agent, então corresponder qualquer coisa é suficiente.

Como alternativa, use mod_setenvif em vez disso. De certa forma, isso seria preferível ao uso de mod_rewrite (acima). (Embora eu acredite que você fez algo assim usando SetEnvIf em outra pergunta e não funcionou para você por algum motivo?)

BrowserMatch "Windows 200[1-9]" bad_agent
<RequireAll>
    Require all granted
    Require not env bad_agent
</RequireAll>

Assumindo o Apache 2.4+. Isso seria usado em combinação com qualquer outra regra de bloqueio que você possua (portanto, talvez seja necessário modificar).

Use BrowserMatchNoCase se você precisar de uma correspondência sem distinção entre maiúsculas e minúsculas.

BrowserMatch is a special case of the SetEnvIf directive that sets environment variables conditionally on the User-Agent HTTP request header.

Referência:
link

    
por 22.09.2017 / 00:27

Tags