Il modo migliore per eliminare xmlrpc.php?


Risposte:


26

Da WordPress 3.5 questa opzione ( XML-RPC) è abilitata per impostazione predefinita e la possibilità di disattivarla da WordPress dashboardè sparita.

Aggiungi questo snippet di codice da utilizzare in 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;
}

Anche se fa quello che dice, può diventare intenso quando un sito è sotto attacco colpendolo.
È possibile utilizzare il seguente frammento di codice nel .htaccessfile.

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

Oppure usa questo per disabilitare l'accesso al xmlrpc.phpfile dal blocco server NGINX.

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

Tieni presente che anche la disabilitazione può avere un impatto sugli accessi tramite dispositivo mobile. Se sono corretto, l'app per dispositivi mobili WordPress ha bisogno di questo.
Vedi Codex per maggiori informazioni sull'uso di XML-RPC.

  • Effettuare sempre un backup dei file prima di modificarli / aggiungerli.


Modifica / Aggiornamento

@Prosti, -Sei assolutamente corretto- riguardo alle opzioni che RESTful APIoffriranno per WordPress!

Ho dimenticato di menzionarlo. Avrebbe dovuto già essere integrato nel core ( WordPress versione 4.1 ) che non era possibile in quel momento. Ma a quanto pare, sarà fondamentale in WordPress 4.5.

L'alternativa per il momento è questo plugin: API REST di WordPress (versione 2)
Puoi usarlo fino a quando non Restful APIè anche il core di WordPress.
Data prevista per il rilascio di WordPress 4.5. (12 aprile 2016 (+ 3w))

Per coloro che sono interessati RESTful, su Stackoverflow è una wiki della community molto bella.


2
Se sono corretto, l'app per dispositivi mobili WordPress ha bisogno di questo - probabilmente questo non sarà necessario in futuro una volta che saremo passati all'API RESTful di WordPress (WordPress 4.5)
prosti

2
Per coloro che ottengono ancora X-Pingbackintestazione per singolo post / pagina. Abbiamo bisogno di usare un altro filtro per rimuoverlo completamente: add_filter('pings_open', '__return_false', PHP_INT_MAX);.
MinhTri,

1
L'aggiunta di cose del genere a functions.phpperderà tutti gli effetti quando si cambiano i temi. function.phpè solo a scopo di progettazione, utilizzare un plug-in!
David,

@David, certo ma ppl usa meglio la cartella mu-plugins, invece di creare un tale plugin. Quando ppl ha bisogno / usa una funzione come questa, questa ha una ragione e non vuole che nessuno (nemmeno un amministratore) abbia la possibilità di disattivare un plugin.
Charles,

Sembra che =manchi un segno di uguale ( ) nella prima riga del codice conf di nginx. Questo ha funzionato per me: location = /xmlrpc.php {
Dave,

6

Quando hai la possibilità di bloccarlo tramite la configurazione del tuo server web, i suggerimenti di @Charles sono buoni.

Se puoi disabilitarlo solo usando php, il xmlrpc_enabledfiltro non è nel modo giusto. Come documentato qui: https://developer.wordpress.org/reference/hooks/xmlrpc_enabled/ disabilita solo i metodi xml rpc che richiedono l'autenticazione.

Utilizza invece il xmlrpc_methodsfiltro per disabilitare tutti i metodi:

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

Puoi verificare se funziona inviando una richiesta POST a xmlrpc.php con il seguente contenuto:

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

Se il filtro funziona, dovrebbero essere rimasti solo 3 metodi:

<?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>

puoi testarlo rapidamente con l'arricciatura:

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

5

Stiamo usando il file htaccess per proteggerlo dagli hacker.

# BEGIN protect xmlrpc.php
<files xmlrpc.php>
order allow,deny
deny from all
</files>
# END protect xmlrpc.php

4

La cosa migliore da fare è disabilitare le xmlrpc.phpfunzioni con un plugin anziché eliminare o disabilitare il file stesso. Il file stesso verrà sostituito dagli aggiornamenti core di WordPress, mentre un plug-in lo manterrà disabilitato dopo gli aggiornamenti core e se cambi temi.

Vedi https://wordpress.org/plugins/search.php?q=disable+xml-rpc per diversi plugin. Tutti hanno differenze minori.

Questi plugin fanno la stessa cosa di una funzione aggiunta al functions.phpfile del tema o aggiungono una order,allow denyregola a .htaccess (come indicato in altre risposte), con la differenza che un plugin o una funzione disabilita le chiamate xmlrpc.phptramite PHP e la regola in .htaccess funziona sfruttando mod_rewrite nel webserver (cioè Apache o Nginx). Non vi è alcuna differenza di prestazioni apprezzabile tra l'utilizzo di PHP e mod_rewrite su un server moderno.


3

Per l'estrema minoranza che ospita WordPress in IIS, è possibile utilizzare il modulo di riscrittura degli URL IIS per applicare restrizioni simili a htaccess. Nell'esempio seguente si presuppone che l'IP client reale arrivi nell'intestazione X-Forwarded-For, l'IP whitelist noto è 55.55.555.555 e che si desidera rispondere con un HTTP 404 a IP non autorizzati.

<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>

0

Nel primo modo puoi inserire il codice add_filter('xmlrpc_enabled', '__return_false');nel file functions.phpo nel plugin specifico del sito. Metterlo chiaramente nel sito specifico è più consigliato della modifica del file functions.php.

e altri modi per eliminare xmlrpc


0

Di recente ho installato Wordfence che, a partire dalla versione 6.3.12, ha la possibilità di bloccare l'accesso diretto a qualsiasi posizione. Mettere /xmlrpc.php nella pagina Opzioni nell'elenco degli IP ad accesso vietato " Blocca immediatamente gli IP che accedono a questi URL" ora mostra un tentativo di blocco ogni 15 minuti circa.

Ciò ha anche il vantaggio di essere in grado di bloccare un URL per sfuggire a quei fastidiosi robot che tornano con un indirizzo IP diverso più volte.

Non so se consente l'utilizzo di xmlrpc.php da parte di Apps per operazioni valide.

Ho avuto alcuni problemi con la produzione di errori 504 Timeout e 502 Bad Gateway sul server all'inizio, ma sembra essersi risolto.

Sono rimasto molto colpito dal risultato finora e ha prodotto un prezioso profilo di pulizia dopo che il sito era stato violato prima di installare Wordfence e nonostante avesse sempre l'ultima versione di WordPress e plugin.

Wordfence https://www.wordfence.com/


L'aggiunta /xmlrpc.phpa una regola di sicurezza che vieta gli IP che vi accedono sembra che potrebbe bloccare il traffico legittimo. Se un sito con pingback abilitato collega il tuo sito, quel sito invierà una richiesta a quell'URL e verrà immediatamente bloccato ... sembra che potrebbe causare problemi.
adam-asdf,

0

io uso per nginx questo piccolo codice e funziona al 100%

location ~* (/wp-content/.*\.php|/wp-includes/.*\.php|/xmlrpc\.php$|/(?:uploads|files)/.*\.php$) {
deny all;
access_log off;
log_not_found off;
return 444;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.