Wyłączenie XML-RPC - bezpieczeństwo WordPress
XML-RPC to stary protokół zdalnego dostępu do WordPress. Kiedyś używany przez aplikacje mobilne i Jetpack, dziś głównie wektor ataków. Brute force, pingback DDoS - większość stron może go bezpiecznie wyłączyć.
Krótka odpowiedź
Co to XML-RPC i dlaczego wyłączyć
Co to:
- Remote Procedure Call protokół
- Plik: /xmlrpc.php
- Pozwala zdalnie: publikować, edytować, zarządzać
Używane przez:
- Jetpack (synchronizacja z WP.com)
- Aplikacja mobilna WordPress
- Zewnętrzne edytory (MarsEdit, Windows Live Writer)
- Pingback/Trackback
Zagrożenia:
- Brute force: wielokrotne próby logowania jednym requestem
- Pingback DDoS: Twoja strona jako źródło ataku
- Fingerprinting: informacje o instalacji
Czy możesz wyłączyć:
- Nie używasz Jetpack? → tak
- Nie używasz apki mobilnej? → tak
- Nie potrzebujesz pingbacków? → tak
- Większość stron może bezpiecznie wyłączyć
Metoda 1: Wtyczka
Disable XML-RPC:
- Wtyczki → Disable XML-RPC
- Aktywuj i gotowe
- Zwraca 403 dla xmlrpc.php
Disable XML-RPC-API:
- Bardziej granularna kontrola
- Możesz wyłączyć tylko pingback
- Zachować inne funkcje
Wordfence:
- Firewall → Brute Force Protection
- Opcja blokowania XML-RPC
- W ramach istniejącego security
Metoda 2: .htaccess
Całkowita blokada:
```apache
Order Deny,Allow
Deny from all
```
Blokada z wyjątkami (Jetpack):
```apache
Order Deny,Allow
Deny from all
Allow from 192.0.64.0/18
Allow from 122.248.245.244
```
Blokada pingback (zachowaj resztę):
- Wymaga wtyczki lub kodu
- .htaccess blokuje wszystko albo nic
Metoda 3: Kod PHP
W functions.php:
Wyłącz całkowicie:
```php
add_filter('xmlrpc_enabled', '__return_false');
```
Wyłącz tylko pingback:
```php
add_filter('xmlrpc_methods', function($methods) {
unset($methods['pingback.ping']);
unset($methods['pingback.extensions.getPingbacks']);
return $methods;
});
```
Usuń header X-Pingback:
```php
add_filter('wp_headers', function($headers) {
unset($headers['X-Pingback']);
return $headers;
});
```
Wyłącz self-pingback:
```php
add_action('pre_ping', function(&$links) {
$home = get_option('home');
foreach ($links as $l => $link) {
if (0 === strpos($link, $home)) {
unset($links[$l]);
}
}
});
```