Cea mai bună metodă de a elimina xmlrpc.php
Care este cea mai bună metodă de a elimina fișierul xmlrpc.php din WordPress atunci când nu ai nevoie de el?

Începând cu WordPress 3.5, această opțiune (XML-RPC
) este activată implicit, iar posibilitatea de a o dezactiva din dashboard
-ul WordPress a dispărut.
Adăugați acest fragment de cod pentru a fi utilizat în functions.php
:
// Dezactivează utilizarea XML-RPC
add_filter( 'xmlrpc_enabled', '__return_false' );
// Dezactivează X-Pingback din header
add_filter( 'wp_headers', 'disable_x_pingback' );
function disable_x_pingback( $headers ) {
unset( $headers['X-Pingback'] );
return $headers;
}
Deși face ceea ce spune, poate deveni intensiv atunci când un site este sub atac prin solicitări repetitive.
Este mai bine să utilizați următorul fragment de cod în fișierul .htaccess
.
# Blochează cererile către xmlrpc.php în WordPress
<Files xmlrpc.php>
order allow,deny
deny from all
</Files>
Sau utilizați această metodă pentru a dezactiva accesul la fișierul xmlrpc.php
din blocul serverului NGINX.
# Blochează cererile către xmlrpc.php în nginx
location /xmlrpc.php {
deny all;
}
Aveți în vedere că dezactivarea poate avea impact și pe autentificările prin dispozitive mobile. Dacă nu mă înșel, aplicația mobilă WordPress are nevoie de această funcționalitate.
Consultați Codex pentru mai multe informații despre utilizareaXML-RPC
.
- Asigurați-vă întotdeauna că faceți o copie de siguranță a fișierelor înainte de a le edita/adauga.
Editare/Actualizare
@Prosti, -Ai absolută dreptate- în legătură cu opțiunile pe care RESTful API
le va oferi pentru WordPress!
Am uitat să menționez acest lucru. Ar fi trebuit deja integrat în nucleu (WordPress versiunea 4.1), ceea ce nu a fost posibil la acea vreme. Dar se pare că va fi inclus în nucleul WordPress 4.5.
Alternativa momentană este acest plugin: WordPress REST API (Versiunea 2)
Puteți-l utiliza până când Restful API
va fi inclus și el în nucleul WordPress.
Data țintă pentru lansarea WordPress 4.5. (12 aprilie 2016 (+3 săptămâni))
Pentru cei interesați de
RESTful
, pe Stackoverflow există un wiki al comunității foarte util.

Dacă înțeleg corect, aplicația mobilă WordPress nu are nevoie de acest lucru - probabil nu va mai fi necesar în viitor odată ce vom trece la WordPress RESTful API (WordPress 4.5)

Pentru cei care încă primesc antetul X-Pingback
pentru postări/pagini individuale. Trebuie să folosim un alt filtru pentru a-l elimina complet: add_filter('pings_open', '__return_false', PHP_INT_MAX);
.

Adăugarea unor astfel de lucruri în functions.php
va face ca toate efectele să se piardă la schimbarea temelor. function.php
este doar pentru scopuri de design, folosește un plugin!

@David, sigur, dar oamenii ar fi mai bine să folosească folderul mu-plugins, în loc să creeze un plugin pentru asta. Când oamenii au nevoie/folosesc o funcție ca aceasta, o au pentru un motiv și nu vor ca nimeni (nici măcar un administrator) să aibă opțiunea de a dezactiva un plugin.

Când ai posibilitatea să blochezi prin configurația serverului web, sugestiile lui @Charles sunt bune.
Dacă poți să-l dezactivezi doar folosind php, filtrul xmlrpc_enabled
nu este calea corectă.
După cum este documentat aici:
https://developer.wordpress.org/reference/hooks/xmlrpc_enabled/
acesta dezactivează doar metodele xml rpc care necesită autentificare.
În schimb, folosește filtrul xmlrpc_methods
pentru a dezactiva toate metodele:
<?php
// Dezactivează toate endpoint-urile xml-rpc
add_filter('xmlrpc_methods', function () {
return [];
}, PHP_INT_MAX);
Poți testa dacă funcționează trimițând o cerere POST către xmlrpc.php cu următorul conținut:
<methodCall>
<methodName>system.listMethods</methodName>
</methodCall>
Dacă filtrul funcționează, ar trebui să rămână doar 3 metode:
<?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>
poți testa rapid cu 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

Cel mai bine este să dezactivați funcțiile xmlrpc.php
cu un plugin în loc să ștergeți sau să dezactivați fișierul în sine. Fișierul în sine va fi înlocuit la actualizările nucleului WordPress, în timp ce un plugin îl va menține dezactivat după actualizări și dacă schimbați teme.
Consultați https://wordpress.org/plugins/search.php?q=disable+xml-rpc pentru diferite plugin-uri. Toate au mici diferențe.
Aceste plugin-uri fac același lucru ca o funcție adăugată în fișierul functions.php
al temei sau adăugarea unei reguli order,allow deny
în .htaccess (așa cum este descris în alte răspunsuri), diferența fiind că un plugin sau o funcție dezactivează apelurile către xmlrpc.php
prin PHP, iar regula din .htaccess funcționează prin utilizarea mod_rewrite în serverul web (adică Apache sau Nginx). Nu există o diferență de performanță semnificativă între utilizarea PHP și mod_rewrite pe un server modern.

Pentru minoritatea extremă care gazduiește WordPress pe IIS, puteți utiliza modulul IIS URL Rewrite pentru a implementa restricții similare cu cele din htaccess. Exemplul de mai jos presupune că adresa IP reală a clientului vine în header-ul X-Forwarded-For, IP-ul cunoscut din lista albilă este 55.55.555.555 și că doriți să răspundeți cu un HTTP 404 pentru IP-uri care nu sunt în lista albilă.
<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>

Cea mai bună metodă este să folosești fișierul .htaccess pentru a bloca toate cererile adăugând
# Blochează cererile către xmlrpc.php în WordPress
<Files xmlrpc.php>
order deny,allow
deny from all
allow from 1.1.1.1
</Files>
la sfârșitul fișierului dar dacă vrei cea mai ușoară metodă, folosirea plugin-ului Disable XML-RPC-API va face treaba.

Am instalat recent Wordfence, care începând cu versiunea 6.3.12 are capacitatea de a bloca accesul direct la orice locație. Adăugând /xmlrpc.php pe pagina de Opțiuni în lista de IP-uri interzise "Blochează imediat IP-urile care accesează aceste URL-uri", acum se afișează o încercare de acces blocată la fiecare 15 minute.
Acest lucru are și avantajul de a putea bloca un URL pentru a scăpa de acei enervanți boti care revin mereu cu o adresă IP diferită.
Nu știu dacă permite utilizarea xmlrpc.php de către Aplicații pentru operațiuni valide.
Am avut câteva probleme inițiale, cum ar fi erorile 504 Timeout și 502 Bad Gateway pe server, dar pare să se fi stabilizat.
Sunt foarte impresionat de rezultatele obținute până acum și a generat un profil valoroas de curățare după ce site-ul a fost hackuit înainte de instalarea Wordfence, în ciuda faptului că aveam întotdeauna ultima versiune de WordPress și plugin-uri.

Adăugarea /xmlrpc.php
într-o regulă de securitate care interzice IP-urile care accesează acest fișier pare că ar putea bloca traficul legitim. Dacă un site cu pingback-uri activate are un link către site-ul tău, acel site va trimite o cerere către acest URL și va fi imediat blocat... pare că ar putea cauza probleme.

Utilizarea unui Plugin de Securitate (Recomandat):
Una dintre cele mai ușoare modalități de a bloca accesul la xmlrpc.php în WordPress este prin utilizarea unui plugin de securitate precum Wordfence
sau Sucuri Security
. Aceste plugin-uri oferă adesea opțiuni pentru a bloca XML-RPC sau fișiere specifice precum xmlrpc.php.
Utilizarea Regulilor pe partea de Server Apache
<Files xmlrpc.php>
Order Deny,Allow
Deny from all
</Files>
Utilizarea Regulilor pe partea de Server Nginx
location ~* /xmlrpc.php {
deny all;
access_log off;
log_not_found off;
}
Reîncărcați nginx
sudo systemctl reload nginx
Dezactivarea XML-RPC prin wp-config.php:
define('XMLRPC_REQUEST', false);
