ScotGu

WordPress安全防护

换成WordPress的第一天开始,在后台APACHE日志中就可以看到各种别有用心的访问。
比如无限POST到/wp-login.php文件的机器人,留言机器人等等。
其中最丧心病狂的却是百度的云观测机器人,
最新的apapche日志共有11394条记录,百度云观测占了10994条。占比96%。

要问我是多久产生的这些日志,第一条日志为2016-03-16 00:24:32 最后一条为2016-03-16 15:04:53
14小时40分钟就访问了万余次。而且我用的WordPress存在默认404页面,虽然没有过多图片,
但是对于服务器来说也是不小的压力,所以我要干掉它!并做好其他安全防护。

对于WordPress而言,可以从几处进行安全防护,
第一、在 .htaccess 文件中进行安全防护。

#禁止外部读取.htaccess
<files ~ "^.*\.([Hh][Tt][Aa])">
order allow,deny
deny from all
satisfy all
</files>

#禁止读取外部wp-config.php
<files wp-config.php>
order allow,deny
deny from all
</files>

#压缩静态数据
AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml application/xhtml+xml text/javascript text/css application/x-javascript 
BrowserMatch ^Mozilla/4 gzip-only-text/html 
BrowserMatch ^Mozilla/4.0[678] no-gzip 
BrowserMatch bMSIE !no-gzip !gzip-only-text/html

#阻止没有referrer来源链接的垃圾评论
RewriteEngine On 
RewriteCond %{REQUEST_METHOD} POST 
RewriteCond %{REQUEST_URI} .wp-comments-post.php* 
RewriteCond %{HTTP_REFERER} !.*wonote.com.* [OR] 
RewriteCond %{HTTP_USER_AGENT} ^$ 
RewriteRule (.*) ^http://%{REMOTE_ADDR}/$ [R=301,L]

#阻止Baidu-YunGuanCe-SLABot扫网站。
SetEnvIfNoCase User-Agent "^Baidu-YunGuanCe-SLABot" bad_bot 
Deny from env=bad_bot

可以根据需要进行适当修改。

第二、在主题模板函数文件(functions.php)中添加安全防护代码。

// 同时删除head和feed中的WP版本号
function ludou_remove_wp_version() {
return '';
}
add_filter('the_generator', 'ludou_remove_wp_version');

// 隐藏js/css附加的WP版本号
function ludou_remove_wp_version_strings( $src ) {
global $wp_version;
parse_str(parse_url($src, PHP_URL_QUERY), $query);
if ( !empty($query['ver']) && $query['ver'] === $wp_version ) {
// 用WP版本号 + 9.9来替代js/css附加的版本号
$src = str_replace($wp_version, $wp_version + 9.9, $src);
}
return $src;
}
add_filter( 'script_loader_src', 'ludou_remove_wp_version_strings' );
add_filter( 'style_loader_src', 'ludou_remove_wp_version_strings' );

//过滤HTTP 1.0的登录POST请求
function wlp_filter_http() {
if(preg_match('/1.0/',$_SERVER['SERVER_PROTOCOL'])) { wlp_forbidden(); }
}
add_action('login_init','wlp_filter_http');

// POST Cookie 保护
function wlp_set_login_protection_cookie() {
if( strtoupper($_SERVER['REQUEST_METHOD'])=='GET' and
!isset($_COOKIE['wlp_post_protection']) ) {
setcookie('wlp_post_protection','1',time()+60*60*24);
$_COOKIE['wlp_post_protection'] = '1';
}
}
function wlp_post_protection() {
if( strtoupper($_SERVER['REQUEST_METHOD'])=='POST' and
!isset($_COOKIE['wlp_post_protection']) ) {
wlp_forbidden();
}
}
add_action('init','wlp_set_login_protection_cookie');
add_action('login_init','wlp_post_protection');

// 增加额外登录验证
function wlp_basic_auth() {
if( !isset($_SERVER['PHP_AUTH_USER']) or !isset($_SERVER['PHP_AUTH_PW']) )
wlp_unauthorized(__('这里什么都没有!', 'memberpress'));
else {
$user = wp_authenticate($_SERVER['PHP_AUTH_USER'],$_SERVER['PHP_AUTH_PW']);

if(is_wp_error($user))
wlp_unauthorized( $user->get_error_message() );
}
}
function wlp_unauthorized($message) {
header('WWW-Authenticate: Basic realm="' . get_option('blogname') . '"');
header('HTTP/1.0 401 Unauthorized');
die(sprintf(__('UNAUTHORIZED: %s', 'memberpress'),$message));
}
add_action('login_init','wlp_basic_auth');

// 登录错误,返回403状态
function wlp_forbidden() {
header("HTTP/1.0 403 Forbidden");
exit;
}

添加“增加额外登录验证及登录错误,返回403状态”代码后,
再次访问WordPress后台则会弹出验证窗口,输入WordPress后台帐号信息即可验证通过。

最后附上一些“优化”代码,也是插入在主题模板函数文件(functions.php)中。

//停用JSON REST API
add_filter('rest_enabled', '__return_false');
add_filter('rest_jsonp_enabled', '__return_false');
remove_action('wp_head', 'rest_output_link_wp_head', 10);
remove_action('template_redirect', 'rest_output_link_header', 11);

// 禁用 Auto Embeds (oEmbed)
remove_action( 'wp_head', 'wp_oembed_add_discovery_links' );
remove_action( 'wp_head', 'wp_oembed_add_host_js'         );
remove_filter( 'the_content', array( $GLOBALS['wp_embed'], 'autoembed' ), 8 );

//屏蔽文章 Embed 功能
remove_action('rest_api_init', 'wp_oembed_register_route');
remove_filter('rest_pre_serve_request', '_oembed_rest_pre_serve_request', 10, 4);
remove_filter('oembed_dataparse', 'wp_filter_oembed_result', 10 );
remove_filter('oembed_response_data',   'get_oembed_response_data_rich',  10, 4);
remove_action('wp_head', 'wp_oembed_add_discovery_links');
remove_action('wp_head', 'wp_oembed_add_host_js');

// 禁用 XML-RPC 接口
add_filter('xmlrpc_enabled', '__return_false');

//关闭 Emoji's
function disable_emojis() {
remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
remove_action( 'admin_print_scripts', 'print_emoji_detection_script' );
remove_action( 'wp_print_styles', 'print_emoji_styles' );
remove_action( 'admin_print_styles', 'print_emoji_styles' );
remove_filter( 'the_content_feed', 'wp_staticize_emoji' );
remove_filter( 'comment_text_rss', 'wp_staticize_emoji' );
remove_filter( 'wp_mail', 'wp_staticize_emoji_for_email' );
add_filter( 'tiny_mce_plugins', 'disable_emojis_tinymce' );
}
add_action( 'init', 'disable_emojis' );
//Filter function used to remove the tinymce emoji plugin.
function disable_emojis_tinymce( $plugins ) {
if ( is_array( $plugins ) ) {
return array_diff( $plugins, array( 'wpemoji' ) );
} else {
return array();
}
}

//媒体库上传文件重命名(自动生成MD5并截取前10位)
function wpyou_rename_upload_file($filename) {
$info = pathinfo($filename);
$ext = empty($info['extension']) ? '' : '.' . $info['extension'];
$name = basename($filename, $ext);
return substr(md5($name), 0, 10) . $ext; // 10 为要截取的文件名长度
}
add_filter('sanitize_file_name', 'wpyou_rename_upload_file', 10);

//禁用Open Sans字体
add_filter( 'gettext_with_context', 'wpdx_disable_open_sans', 888, 4 );
function wpdx_disable_open_sans( $translations, $text, $context, $domain ) {
  if ( 'Open Sans font: on or off' == $context && 'on' == $text ) {
    $translations = 'off';
  }
  return $translations;
}

//Gravatar头像地址替换
function WoNote_get_avatar($avatar) {
    $avatar = str_replace(array("www.gravatar.com","0.gravatar.com","1.gravatar.com","2.gravatar.com"),"cn.gravatar.com",$avatar);
    return $avatar;
}
add_filter( 'get_avatar', 'WoNote_get_avatar', 10, 3 );

看来是我误会百度云观测了,因为很久之前,久到我已经不记得什么时候了,
是我开启了ce.baidu.com的功能。
20160317121507
已经被我关闭了。

致谢:
WordPress 登录保护加强版
WordPress禁用Emoji表情及本地化Emoji提高网站速度

本文:《WordPress安全防护》发表在「WoNote」
文章链接:http://www.wonote.com/wordpress-security-settings/

评论