Melhor maneira de eliminar xmlrpc.php?

25

Qual é a melhor maneira de eliminar o arquivo xmlrpc.php do WordPress quando você não precisa?

prosti
fonte

Respostas:

26

Desde o WordPress 3.5, esta opção ( XML-RPC) é ativada por padrão, e a capacidade de desativá-la do WordPress dashboarddesaparece.

Adicione este snippet de código para uso em functions.php:

// Disable use XML-RPC
add_filter( 'xmlrpc_enabled', '__return_false' );

// Disable X-Pingback to header
add_filter( 'wp_headers', 'disable_x_pingback' );
function disable_x_pingback( $headers ) {
    unset( $headers['X-Pingback'] );

return $headers;
}

Embora faça o que diz, pode ficar intensivo quando um site está sob ataque ao atingi-lo.
Você pode usar o seguinte snippet de código no seu .htaccessarquivo.

# Block WordPress xmlrpc.php requests
<Files xmlrpc.php>
order allow,deny
deny from all
</Files>

Ou use-o para desativar o acesso ao xmlrpc.phparquivo no bloco do servidor NGINX.

# nginx block xmlrpc.php requests
location /xmlrpc.php {
    deny all;
}

Esteja ciente de que a desativação também pode ter impacto nos logins pelo celular. Se eu estiver correto, o aplicativo móvel do WordPress precisa disso.
Veja Codex para mais informações sobre o uso de XML-RPC.

  • Faça sempre um backup do (s) arquivo (s) antes de editar / adicionar.


Editar / Atualizar

@Prosti, -Você está absolutamente correto- sobre as opções que RESTful APIoferecerão para o WordPress!

Eu esqueci de mencionar isso. Ele já deveria ter sido integrado ao núcleo ( WordPress versão 4.1 ), o que não era possível naquele momento. Mas, ao que parece, será essencial no WordPress 4.5.

A alternativa no momento é este plugin: API REST do WordPress (versão 2)
Você pode usá-lo até que Restful APItambém seja essencial para o WordPress.
Data prevista para o lançamento do WordPress 4.5. (12 de abril de 2016 (+ 3 sem))

Para aqueles que estão interessados RESTful, no Stackoverflow é um wiki muito bom da comunidade.

Charles
fonte
2
Se eu sou WordPress correta aplicação móvel não precisa disso - provável que este não será necessário no futuro uma vez que temos transição para WordPress RESTful API (WordPress 4.5)
prosti
2
Para quem ainda recebe X-Pingbackcabeçalho para uma única postagem / página. Precisamos usar outro filtro para removê-lo completamente: add_filter('pings_open', '__return_false', PHP_INT_MAX);.
MinhTri
11
Adicionar coisas assim functions.phpperderá todo o efeito ao alterar os temas. function.phpé apenas para fins de design, use um plugin!
David
@ David, claro, mas ppl, então é melhor usar a pasta mu-plugins, em vez de criar um plugin desse tipo. Quando o ppl precisa / usa uma função como essa, ele a possui por um motivo e não deseja que ninguém (nem mesmo um administrador) tenha a opção de desativar um plugin.
Charles
Parece que existe um sinal de igual ( =) ausente na primeira linha do código conf nginx. Isso funcionou para mim: # location = /xmlrpc.php {
760 Dave Dave
5

Estamos usando o arquivo htaccess para protegê-lo contra hackers.

# BEGIN protect xmlrpc.php
<files xmlrpc.php>
order allow,deny
deny from all
</files>
# END protect xmlrpc.php
Jorin van Vilsteren
fonte
5

Quando você pode bloqueá-lo através da configuração do servidor da web, as sugestões do @Charles são boas.

Se você só pode desativá-lo usando php, o xmlrpc_enabledfiltro não é o caminho certo. Como documentado aqui: https://developer.wordpress.org/reference/hooks/xmlrpc_enabled/ , desativa apenas métodos xml rpc que requerem autenticação.

Em vez disso, use o xmlrpc_methodsfiltro para desativar todos os métodos:

<?php
// Disable all xml-rpc endpoints
add_filter('xmlrpc_methods', function () {
    return [];
}, PHP_INT_MAX);

Você pode testar se está funcionando enviando uma solicitação POST para xmlrpc.php com o seguinte conteúdo:

<methodCall>
    <methodName>system.listMethods</methodName>
</methodCall>

Se o filtro estiver funcionando, restarão apenas três métodos:

<?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
    <params>
        <param>
            <value>
                <array>
                    <data>
                        <value>
                            <string>system.multicall</string>
                        </value>
                        <value>
                            <string>system.listMethods</string>
                        </value>
                        <value>
                            <string>system.getCapabilities</string>
                        </value>
                    </data>
                </array>
            </value>
        </param>
    </params>
</methodResponse>

você pode testá-lo rapidamente com curl:

curl -X POST \
  -H 'Cache-Control: no-cache' \
  -H 'Content-Type: application/xml' \
  -d '<methodCall><methodName>system.listMethods</methodName></methodCall>' \
  https://your-wordpress-site.com/xmlrpc.php
tweber
fonte
4

A melhor coisa a fazer é desativar as xmlrpc.phpfunções com um plug-in em vez de excluir ou desativar o próprio arquivo. O arquivo em si será substituído nas atualizações principais do WordPress, enquanto um plug-in o manterá desativado após as atualizações principais e se você alterar os temas.

Veja https://wordpress.org/plugins/search.php?q=disable+xml-rpc para obter diferentes plugins. Todos eles têm pequenas diferenças.

Esses plug-ins fazem a mesma coisa que uma função adicionada ao functions.phparquivo do tema ou adicionando uma order,allow denyregra ao .htaccess (conforme descrito em outras respostas), com a diferença de que um plug-in ou função desativa as chamadas xmlrpc.phpvia PHP e a regra no .htaccess funciona aproveitando o mod_rewrite no servidor da web (ou seja, Apache ou Nginx). Não há diferença significativa de desempenho entre o uso de PHP e mod_rewrite em um servidor moderno.

markratledge
fonte
3

Para a minoria extrema que hospeda o WordPress no IIS, você pode usar o módulo IIS URL Rewrite para fazer restrições semelhantes ao htaccess. O exemplo abaixo pressupõe que o IP do cliente verdadeiro está chegando no cabeçalho X-Forwarded-For, o IP da lista de desbloqueio conhecido é 55.55.555.555 e que você deseja responder com um HTTP 404 para IPs que não sejam da lista de desbloqueio.

<rule name="wordpress-restrictions" enabled="true" stopProcessing="true">
    <match url="(^xmlrpc.php)|(^wp-admin)|(^wp-login.php)" />
    <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
        <add input="{HTTP_X_FORWARDED_FOR}" pattern="(^55\.55\.555\.555$)" negate="true" />
    </conditions>
    <action type="CustomResponse" statusCode="404" subStatusCode="44" statusReason="File or directory not found" statusDescription="The resource you are looking for might have been removed, had its name changed, or is temporarily unavailable." />
</rule>
Latão
fonte
0

Da primeira maneira, você pode colocar o código add_filter('xmlrpc_enabled', '__return_false');no arquivo functions.phpou no plug-in específico do site. Colocá-lo claramente no site é mais recomendado do que editar o arquivo functions.php.

e outras maneiras de eliminar xmlrpc

yaser hamzeloy
fonte
0

Instalei recentemente o Wordfence que, a partir da versão 6.3.12, pode bloquear o acesso direto a qualquer local. Colocar /xmlrpc.php na página Opções na lista de IPs de acesso proibido "Bloquear imediatamente IPs que acessam esses URLs" agora está mostrando uma tentativa de bloqueio a cada 15 minutos.

Isso também tem a vantagem de poder bloquear uma URL para escapar daqueles bots traquinas que retornam com um endereço IP diferente várias vezes.

Não sei se ele permite o uso do xmlrpc.php pelo Apps para operações válidas.

Eu tive alguns problemas com a produção de erros 504 Timeout e 502 Bad Gateway no servidor no início, mas parece que ele se acalmou.

Muito impressionado com o resultado até agora e produziu um valioso perfil de limpeza após o site ter sido hackeado antes de instalar o Wordfence e apesar de sempre ter a versão mais recente do WordPress e plugins.

Wordfence https://www.wordfence.com/

Steve
fonte
Ao adicionar /xmlrpc.phpuma regra de segurança que proíbe IPs que acessam, parece que ele pode bloquear o tráfego legítimo. Se um site com pingbacks ativado vincular ao seu site, ele enviará uma solicitação para esse URL e será imediatamente bloqueado ... parece que isso pode causar problemas.
Adam-asdf
0

eu uso para nginx este pequeno código e isso funciona 100%

location ~* (/wp-content/.*\.php|/wp-includes/.*\.php|/xmlrpc\.php$|/(?:uploads|files)/.*\.php$) {
deny all;
access_log off;
log_not_found off;
return 444;
}
Manuel K
fonte