Zabezpečení WordPressu

1 PHP, Bezpečnost, htaccess, Tipy & triky

Příklady a tipy, jak lépe zabezpečit WordPress weby ať už pomocí pluginů, nebo vlastními silami pomocí filtrů a akcí zapsaných do functions.php

Zabezpečení WordPressu

V poslední době bylo napadeno mnoho webů, kvůli zranitelnosti v API ve WordPressu. Chyba je opravena ve verzi 4.7.2, přesto ale weby na WordPressu jsou často terčem útoků. V článku proto zmíním možnosti, jak si web trochu více zabezpečit.

Nebudu se zde zabývat tím, že by nemělo být jméno pro správce admin, o síle hesel, rozdávání přístupů na potkání, pravidelným aktualizacím apod. Toto beru jako samozřejmost. Jen zmíním, že je dobré při instalaci změnit prefix databázových tabulek. Lze to udělat i později, ale není to tak pohodlné.

Odebrání tagů z head a chyba při přihlašování

Tento krok sice nepomůže zvýšit bezpečnost. Jednotlivé adresy budou stále dostupné, pouze to vyčistí hlavičky. Ale třeba zmizí, jaká verze WP je použita, což může být užitečné.
Následující kód stačí vložit do functions.php dané šablony.

function removeUnnecessaryTagsInHead()
{
    remove_action( 'wp_head', 'wp_generator' ) ;
    remove_action( 'wp_head', 'wlwmanifest_link' ) ;
    remove_action( 'wp_head', 'rsd_link' ) ;
    remove_action( 'template_redirect', 'rest_output_link_header', 11, 0 );
    remove_action( 'wp_head', 'wp_oembed_add_discovery_links');
    remove_action( 'wp_head', 'rest_output_link_wp_head');
    remove_action( 'template_redirect', 'wp_shortlink_header', 11 );

    // Odebere odkazy na RSS, nemusí být úplně žádoucí...
    remove_action( 'wp_head', 'feed_links', 2 );
    remove_action( 'wp_head', 'feed_links_extra', 3 );
}
add_filter('init', 'removeUnnecessaryTagsInHead');

Špatné jméno nebo heslo

WordPress v základu při vyplnění špatného hesla zobrazí hlášku: Heslo pro jméno xxx není správné. Toto není úplně ideální, takto může uživatel zkoušet, jestli existuje přihlašovací jméno, a poté už jen hádat hesla. Naštěstí lze hlášku přepsat a vracet stále to stejné.

// Zrušíme detailní výpis kde je chyba při přihlašování
function no_wordpress_errors() {
  return 'Chybné údaje!';
}
add_filter('login_errors', 'no_wordpress_errors');

Zrušení XML-RPC a JSON API

XML-RPC již je ve WordPressu delší dobu, JSON API nově. Obojí ale umožní programově pracovat s WordPressem a také provádět útoky, proti kterým se hůře brání. Pokud není použita šablona, nebo jiná služba, která tyto API využívá, můžou být vypnuty.

Zatímco XML-RPC API se může vypnout úplně, u JSON API se to nedoporučuje. Pravděpodobně bude využíváno i v samotné administraci, takže jeho zakázáním by mohlo dojít k znefunkčnění nějaké části WordPressu.

Zrušení XML-RPC API

Zrušení lze provést vcelku jednoduše, a to zakázáním přístupu k souboru xmlrpc.php. Pokud ale je využito pingbacků u WP, tak ty jsou tvořeny právě přes XML-RPC. Já je ale nevyužívám, takže XML-RPC vypínám. Následující kód stačí vložit do na začátek souboru .htaccess.

<files xmlrpc.php>
order allow,deny
deny from all
</files>

Zrušení JSON API

Jak bylo řečeno, úplné vypnutí se nedoporučuje. Naštěstí se dá zakázat přístup do API nepřihlášeným uživatelům, stačí vložit do functions.php v šabloně.

function disableNonLoggedUser($allow) {
    if(!is_user_logged_in()){
        return new WP_Error('no_access', 'Not allowed', ['status' => 403 ]);
    }
    return $allow;
}
add_filter( 'rest_authentication_errors', 'disableNonLoggedUser' );

Úplně se dá API odříznout pomocí přesměrování v htaccess. Takto se dají zakázat i jednotlivé části API. Stačí zapsat tyto příkazy do .htaccess. Zde ale pozor, musí být po RewriteEngine On a před RewriteRule, který vše přesměruje na index.php.

# Zakáže celé JSON API
RewriteCond %{REQUEST_URI} wp-json/wp [NC,OR]
RewriteCond %{REQUEST_URI} wp-json/wp [NC]
RewriteRule .* - [F]

# Zakáže pouze část API s users a všechny metody s nimi
RewriteCond %{REQUEST_URI} wp-json/wp/[^/]+/users [NC,OR]
RewriteCond %{REQUEST_URI} wp-json/wp/[^/]+/users [NC]
RewriteRule .* - [F]

Změny nastavení WordPressu

Následující úpravy jsou, stejně jako předchozí, charakteru Udělej si sám, pluginy jsou na řadě poté. Přesto by neměl být problém je zvládnout i se základními znalostmi.

Změny konfiguračního souboru

Všechny tyto úpravy se provádí v souboru wp-config.php:

// Zakáže editaci souborů (šablony apod.) přes administraci
define('DISALLOW_FILE_EDIT', true);

// Povolí automatické aktualizace i majoritních verzí jádra
// Toto je na zvážení, jestli opravdu chcete
// WordPress nyní provádí aktualizace minoritní automaticky
define( 'WP_AUTO_UPDATE_CORE', true );

// Automatická aktualizace pluginů
// Rovněž na zváření, jestli to chcete
add_filter( 'auto_update_plugin', '__return_true' );
// To samé pro šablony
add_filter( 'auto_update_theme', '__return_true' );

Zakázání spouštění PHP skriptů v uploads

Přes WordPress sice PHP soubor nelze nahrát, i tak ale nemusí být od věci spouštění skriptů PHP ve složce uploads zakázat. Stačí vytvořit soubor .htaccess a vložit jej do složky wp-content/uploads/.

<Files *.php>
deny from all
</Files>

Bezpečnostní pluginy

Nebudu se zde zabývat, který plugin je lepší. Každému sedí něco jiného, takže jen vypíšu ty nejznámější, nechť si každý vybere, co mu sedne.

Pravidelné aktualizace

Jak jsem říkal, nebudu se zabývat tím, že je nutné provádět aktualizace jak WordPressu, tak pluginů a šablon. Přesto je tu nástroj, který s tímto může pomoct. Zabýval jsem se tímto nástrojem v článku Spravujte všechny WordPress weby z jednoho místa, a rozhodně vám může ulehčit aktualizace všech webů, bez složitého přihlašování do každého z nich.


Problém děravého JSON-API je více popsán na root.cz. Se zkušenosti ohledně zabezpečení WordPressu se můžete podělit v komentářích

K tomuto článku již není možné přidávat další komentáře

Komentáře

Užitečné rady, jak zabezpečit wordpress web jsem našla i tady: http://freshface.cz/zabezpeceni-wordpress-webu-behem-10-minut/