A proteção de senha do administrador do WordPress não funciona no servidor Nginx

1

Estou totalmente confuso com a proteção por senha do servidor Nginx. Não funciona como queremos. Este é o meu bloco de configuração do site Nginx.

server {

    listen 80;
    server_name example.com;
    return 301 http://www.example.com$request_uri;

}

server {

    listen 80;
    server_name www.example.com;

    root /var/www/example.com/public;
    index index.html index.php;

    access_log /var/www/example.com/access.log;
    error_log /var/www/example.com/error.log;

    location ~ /\.svn/* {
        deny all;
    }

    location ~ \.(htaccess|htpasswd) {
        deny all;
    }

    location ~ \.conf$ {
        deny all;
    }

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    # Add trailing slash to */wp-admin requests.
    rewrite /wp-admin$ $scheme://$host$uri/ permanent;

    # Directives to send expires headers and turn off 404 error logging.
    location ~* \.(js|css|xml)$ {
        expires 30d;
        access_log off;
        log_not_found off;
    }

    location ~* \.(?:ico|gif|jpe?g|png|svg)$ {
        expires max;
        add_header Pragma public;
        add_header Cache-Control "public";
        access_log off;
        log_not_found off;
    }

    # W3TC rules
    include /var/www/example.com/nginx.conf;

    # Pass all .php files onto a php-fpm/php-fcgi server.
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;

        fastcgi_buffer_size 128k;
        fastcgi_buffers 256 16k;
        fastcgi_busy_buffers_size 256k;
        fastcgi_temp_file_write_size 256k;

        include fastcgi_params;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param SCRIPT_NAME     $fastcgi_script_name;
        fastcgi_pass 127.0.0.1:9000;
    }

    location /search {
        limit_req zone=wpsearch burst=3 nodelay;
        try_files $uri /index.php;
    }

    rewrite ^(.*)/undefined$ /$1 permanent;
    rewrite ^(.*)/undefined/$ /$1 permanent;

    # WordPress SEO Sitemap
    rewrite ^/sitemap_index\.xml$ /index.php?sitemap=1 last;
    rewrite ^/([^/]+?)-sitemap([0-9]+)?\.xml$ /index.php?sitemap=$1&sitemap_n=$2 last;

}

Agora, quando eu protejo com senha a pasta wp-admin , ela não funciona exatamente como deveria. Para proteger a pasta wp-admin , usei isso ...

    location /wp-admin {
        auth_basic "Restricted";
        auth_basic_user_file /var/www/.htpasswd;
    }

Agora, se eu acessar meu site em www.example.com/wp-admin , ele solicitará a senha. Mas se eu tentar acessar o site com este URL www.example.com/wp-admin/index.php , o servidor não pedirá Http Authentication e facilmente me permita acessar e acessar a seção de administração.

Portanto, o problema é que, embora /wp-admin seja protegido por senha, o conteúdo interno não é. Ainda posso acessar arquivos de imagem, css, arquivos php dentro dessa pasta.

Além disso, também quero proteger com senha /wp-login.php , então adicionei um bloco semelhante como sugerido no WordPress codex , mas o Nginx não bloqueia nada.

    location /wp-login.php {
        auth_basic "Restricted";
        auth_basic_user_file /var/www/.htpasswd;
    }

Conheça quase todos os exemplos de A proteção contra ataques de brute force do WordPress não funciona.

Por favor, explique o que exatamente é o problema aqui. Parece que estou perdendo alguma coisa.

    
por Robert hue 18.11.2014 / 20:30

1 resposta

1

Uma localização regexp sempre tem precedência. Isso significa que você deve evitar locais de regexp globais nesses casos. Você pode certamente usá-los como sub-locais na sua configuração de localização. E sim, isso significa duplicação de configuração para tudo que você deseja combinar com locais de regex.

Você pode evitar a correspondência de arquivos desnecessários usando lookbehind negativo em sua expressão regular (cuidado, deve funcionar, mas não testado):

location ~ (?<!wp-admin\/).+\.php$ {
    ...
}

O mesmo acontece com a localização das suas imagens.

Claro, depois de fazer isso, você deve adicionar sub-locais em sua localização /wp-admin para arquivos e imagens php:

location /wp-admin {
    ...
    location ~* \.(?:ico|gif|jpe?g|png|svg)$ {
        expires max;
        add_header Pragma public;
        add_header Cache-Control "public";
        access_log off;
        log_not_found off;
    }
}

Quanto a wp-login.php , há um local exato que tem precedência sobre os locais de regex:

location =/wp-login.php {
    ...
}

No entanto, você deve especificar as configurações do fastcgi neste local para fazer o PHP-FPM manipular o pedido.

Todos esses truques são possíveis e funcionam, mas exigem muito copiar e colar, pois o local regex não continuará agregando configurações de outros locais e terminará assim que possível.

No seu caso, você pode simplesmente adicionar uma expressão condicional na configuração do seu servidor e evitar todo esse processo de copiar e copiar:

if ( $uri ~ "^\/(wp-admin|wp-login)" ) {
    auth_basic "Restricted";
    auth_basic_user_file /var/www/.htpasswd;
}

No entanto, o uso da instrução "if" tem muitos problemas possíveis. Você foi avisado .

    
por 19.11.2014 / 01:01