隐藏 WordPress 系统,提高 WordPress 站点安全性

雷石 177 5

出于保密和安全方面的原因,一些用户会考虑把网站所用的后台隐藏起来,这中需求有一个收费插件叫「hide my wp」,如果你没有办法购买,或者不想使用插件,这篇文章就是为你准备的。本文中的方法适合有一定动手能力的用户使用。下面我们就来看看怎么一步一步地把 WordPress 隐藏掉。

URL 重定向

WordPress 的目录结构是最具特色的,如果不经过处理,别人通过代码一眼就能看出来你的网站是用的 WordPress,我们首先需要做的就是修改掉 WordPress 的目录结构。

  1. /**
  2.  * URL 重定向
  3.  *
  4.  * 重定向:
  5.  *  /wp-content/themes/themename/assets/css/ 到/assets/css/
  6.  *  /wp-content/themes/themename/assets/js/ 到/assets/js/
  7.  *  /wp-content/themes/themename/assets/img/ 到/assets/img/
  8.  *  /wp-content/plugins/ to /plugins/
  9.  */
  10. function nowp_add_rewrites($content) {
  11.     global $wp_rewrite;
  12.     $nowp_new_non_wp_rules = array(
  13.         'assets/(.*)' => THEME_PATH . '/assets/$1',
  14.         'plugins/(.*)'   => RELATIVE_PLUGIN_PATH . '/$1'
  15.     );
  16.     $wp_rewrite->non_wp_rules = array_merge($wp_rewrite->non_wp_rules, $nowp_new_non_wp_rules);
  17.     return $content;
  18. }
  19.  
  20. function nowp_clean_urls($content) {
  21.     if (strpos($content, RELATIVE_PLUGIN_PATH) > 0) {
  22.         return str_replace('/' . RELATIVE_PLUGIN_PATH,  '/plugins', $content);
  23.     } else {
  24.         return str_replace('/' . THEME_PATH, '', $content);
  25.     }
  26. }
  27.  
  28. //不重写多站点和自主体
  29. if ( !is_multisite() && !is_child_theme() ) {
  30.     add_action('generate_rewrite_rules', 'nowp_add_rewrites');
  31.     if ( !is_admin() ) {
  32.         $tags = array(
  33.             'plugins_url',
  34.             'bloginfo',
  35.             'stylesheet_directory_uri',
  36.             'template_directory_uri',
  37.             'script_loader_src',
  38.             'style_loader_src'
  39.         );
  40.         add_filters($tags, 'nowp_clean_urls');
  41.     }
  42. }

以上代码假设在你的主题中有/assets/文件夹,如果你使用的是 Apache 服务器,WordPress 会自动为你重建好重写需要的.htacces文件,如果你使用的是 Nginx,还需要手动添加重写规则到你的主机配置文件中。

  1. location ~ ^/assets/(img|js|css|fonts)/(.*)$ {
  2.   try_files $uri $uri/ /wp-content/themes/YOURTHEME/$1/$2;
  3. }
  4. location ~ ^/plugins/(.*)$ {
  5.   try_files $uri $uri/ /wp-content/plugins/$1;
  6. }

上面的规则硬编码了 /wp-content/ 目录,如果你在主题中修改了 WP_CONTENT_URL 或 WP_CONTENT_DIR 常量,可能会出现冲突,确保以上代码中的 wp-content 目录是正确的就可以了。

使用相对链接

所有的地方都使用绝对链接也是 WordPress 的一大特点,其实这是没有必要的,我们通过下面的代码可以吧绝对链接修改成为相对链接。

  1. /**
  2.  * 修改绝对链接为相对链接
  3.  *
  4.  * 提取自Roots主题
  5.  */
  6. function nowp_root_relative_url($input) {
  7.     preg_match('|https?://([^/]+)(/.*)|i', $input, $matches);
  8.  
  9.     if (isset($matches[1]) && isset($matches[2]) && $matches[1] === $_SERVER['SERVER_NAME']) {
  10.         return wp_make_link_relative($input);
  11.     } else {
  12.         return $input;
  13.     }
  14. }
  15. function nowp_enable_root_relative_urls() {
  16.     return !( is_admin() || in_array($GLOBALS['pagenow'], array('wp-login.php', 'wp-register.php')) );
  17. }
  18. $root_rel_filters = array(
  19.     'bloginfo_url',
  20.     'the_permalink',
  21.     'wp_list_pages',
  22.     'wp_list_categories',
  23.     'the_content_more_link',
  24.     'the_tags',
  25.     'get_pagenum_link',
  26.     'get_comment_link',
  27.     'month_link',
  28.     'day_link',
  29.     'year_link',
  30.     'tag_link',
  31.     'the_author_posts_link',
  32.     'script_loader_src',
  33.     'style_loader_src'
  34. );
  35. add_filters($root_rel_filters, 'nowp_root_relative_url');

清理 HTML Head 中没用的代码

WordPress 在 <head> 中添加了很多我们平时用不到的代码,这不但增加了垃圾代码,对网站后台系统也暴露得很充分,好在我们可以很容易的清理掉这些代码,添加以上代码到主题的 functions.php 文件中即可。

  1. /**
  2.  * 清理wp_head()
  3.  *
  4.  * 移除不需要的 <link>'s
  5.  * Remove inline CSS used by Recent Comments widget
  6.  * Remove inline CSS used by posts with galleries
  7.  * Remove self-closing tag and change ''s to "'s on rel_canonical()
  8.  */
  9. function nowp_head_cleanup() {
  10.     // Remove junk from head
  11.     remove_action('wp_head', 'rsd_link');
  12.     remove_action('wp_head', 'wp_generator');
  13.     remove_action('wp_head', 'feed_links', 2);
  14.     remove_action('wp_head', 'index_rel_link');
  15.     remove_action('wp_head', 'wlwmanifest_link');
  16.     remove_action('wp_head', 'feed_links_extra', 3);
  17.     remove_action('wp_head', 'start_post_rel_link', 10, 0);
  18.     remove_action('wp_head', 'parent_post_rel_link', 10, 0);
  19.     remove_action('wp_head', 'adjacent_posts_rel_link', 10, 0);
  20.     remove_action('wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0);
  21.     remove_action('wp_head', 'wp_shortlink_wp_head', 10, 0);
  22.     remove_action('wp_head', 'feed_links', 2);
  23.     remove_action('wp_head', 'feed_links_extra', 3);
  24.  
  25.     global $wp_widget_factory;
  26.     remove_action('wp_head', array($wp_widget_factory->widgets['WP_Widget_Recent_Comments'], 'recent_comments_style'));
  27.  
  28.     if (!class_exists('WPSEO_Frontend')) {
  29.         remove_action('wp_head', 'rel_canonical');
  30.         add_action('wp_head', 'nowp_rel_canonical');
  31.     }
  32. }
  33. function nowp_rel_canonical() {
  34.     global $wp_the_query;
  35.  
  36.     if (!is_singular()) {
  37.         return;
  38.     }
  39.  
  40.     if (!$id = $wp_the_query->get_queried_object_id()) {
  41.         return;
  42.     }
  43.  
  44.     $link = get_permalink($id);
  45.     echo "\t<link rel=\"canonical\" href=\"$link\">\n";
  46. }
  47. add_action('init', 'nowp_head_cleanup');
  48.  
  49. /**
  50.  * Remove the WordPress version
  51.  */
  52. add_filter('the_generator', '__return_false');
  53.  
  54. /**
  55.  * Clean up language_attributes() used in <html> tag
  56.  *
  57.  * Change lang="en-US" to lang="en"
  58.  * Remove dir="ltr"
  59.  */
  60. function nowp_language_attributes() {
  61.     $attributes = array();
  62.     $output = '';
  63.  
  64.     if (function_exists('is_rtl')) {
  65.         if (is_rtl() == 'rtl') {
  66.             $attributes[] = 'dir="rtl"';
  67.         }
  68.     }
  69.  
  70.     $lang = get_bloginfo('language');
  71.  
  72.     if ($lang && $lang !== 'en-US') {
  73.         $attributes[] = "lang=\"$lang\"";
  74.     } else {
  75.         $attributes[] = 'lang="en"';
  76.     }
  77.  
  78.     $output = implode(' ', $attributes);
  79.     $output = apply_filters('nowp_language_attributes', $output);
  80.  
  81.     return $output;
  82. }
  83. add_filter('language_attributes', 'nowp_language_attributes');

大功告成

以上操作可以隐藏绝大多数的 WordPress 信息,大大提高 WordPress 的安全性,虽然高手还能通过一些手段看得出来,但是比什么都不做还是要好多了。

发表评论 取消回复
表情 图片 链接

  1. 雷石 Lv 3

    聊胜于无吧,

  2. 萧瑟 Lv 1

    牛皮,这教程可以。下次我也试试。

    • 许都 站长

      @萧瑟还有隐藏wordpress版本。我建议你把后台默认账户改了 把admin账户权限降到最低

      • 萧瑟 Lv 1

        @许都默认账户admin?可是我的默认账户不是admin,权限降低是个什么操作?
        PS:你那个回复邮件的泄露你服务器IP了咯[aru_36]

        • 许都 站长

          @萧瑟这也是没有办法的事情。

分享