WordPress: skrytí informací

Jedna z důležitých věcí, při používání WordPressu, je skrytí některých informací, kterými web „napovídá“ potenciálnímu útočníkovi. Informace o CMS, na němž web běží, společně s používanou verzí jsou nápomocné k útoku, snadněji se hledá slabina konkrétní verze.

Popisuji postup pro práci s odbozenou šablonou. I v případě nasazení site builderů (minimálně pro Divi to platí) lze využít child theme, či bývá k dispozici způsob pro vložení uživatelských scriptů.

Úryvky kódu přidejte do functions.php. Pro skrytí verzí jsou použité funkce z jádra WorpPressu remove_action a add_filter.

Zkušenější oko pozná web běžící na WordPressu, při pohledu do vygenerovaného HTML. Ale potenciálnímu útočníkovi není nutné dávat moc podrobných informací. Postranní efekt je velmi nepatrná úspora přenesených dat (v době psaní článku je v ČR na mobilních sítích ještě stále „doba FUPová“).

Skrytí verze, přidávané k názvům skriptů a stylů:

function remove_enq_version($str){
    if (strpos( $str, 'ver=')) {
        $str = remove_query_arg('ver', $str);
    }
    return $str;
}
add_filter('style_loader_src', 'remove_enq_version', 9999);
add_filter('script_loader_src', 'remove_enq_version', 9999);

Odstranění „nepotřebných“ informací:

function removeUnnecessaryHead() {
    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', 'rest_output_link_wp_head');
    remove_action( 'wp_head', 'wp_oembed_add_discovery_links');
    remove_action( 'template_redirect', 'wp_shortlink_header', 11 );
    remove_action('wp_head', 'wp_shortlink_wp_head', 10);
    //odebrani RSS z hlavicek
    remove_action( 'wp_head', 'feed_links', 2 );
    remove_action( 'wp_head', 'feed_links_extra', 3 );
}
add_filter('init', 'removeUnnecessaryHead');

(funkce končící _head se vztahují k vygenerovanému HTML kódu, funkce končící _header se vztahují k hlavičkám poslaným HTTP serverem.)

Stručně co skrýváme:

  • wp_generator – Identifice WordPressu jako takového (tag: <meta name="generator" content="WordPress 5.2.2" /> ), včetně verze WP.
  • wlwmanifest_link – Odkaz pro Windows Live Writer, pokud editor od Microsoftu používáte, řádek vynechte.
  • rsd_link – Odkaz pro Really Simple Discovery, to asi také využije málokdo.
  • rest_output_link_header, rest_output_link_wp_head – Odkazy pro REST API.
  • wp_oembed_add_discovery_links – Odkaz pro oEmbed, asi jej potřebuje jej málokterý provozovatel webu.
  • wp_shortlink_header, wp_shortlink_wp_head – zde lze polemizovat, jestli zakázat vytvoření dvojice odkazů v hlavičce (<link rel="canonical" href="https://example.com/dc/index.php/pokus/" /> a
    <link rel='shortlink' href='https://example.com/dc/?p=16' />), příčemž první je „pěkná“ pro vyhledávače, zatímco krátká se bude líbit některým službám (LinkedIn, Twitter, Facebook).

Skrytí RSS (remove_action( 'wp_head', 'feed_links', 2 ); a remove_action( 'wp_head', 'feed_links_extra', 3 );) použiji jedině v případě,že stránky jsou fakticky statické, jen prezentace bez publikkování článků. RSS odkazy usnadní přidání sledování webu do čtečky.

Závěrečné poznámky

Skrytí informací o verzi je jedním, nikoliv jediným krokem k lepší bezpečnosti, bez nápovědy to bude mít potenciální útočník trochu těžší.

Abych neustále nekopíroval stejné fragmenty kódu a měl functions.php jen tak malý, jak je nutné pro daný web, mám vytvořeny dva soubory functions_wp.php a functions_woo.php (pokud potřebuji WooCommerce), které nakopíruji do odvozené šablony a v souboru functions.php je připojím PHP funkcí require.