WordPressのセキュリティ実装をプラグインなしで実装する方法
みなさんこんにちは!エンジニアの高澤です!
今回はWordPressのセキュリティ実装をプラグインなしで実装する方法について解説していきたいと思います。
セキュリティ機能を利用できるプラグインはいくつかありますが、場合によってはWordPressを重くしたくない、より柔軟にカスタマイズできるようにして独自にセキュリティを高めたいなどといったケースがあるかと思います。
そんな時に当記事の内容が非常に役立つかと思いますので、よろしければぜひお仕事でご活用いただけましたら幸いです。
当記事のセキュリティ実装コードの内容
当記事で解説するセキュリティ周りの実装コードの内容は以下になります。
- WP REST API を無効にする
- authorクエリの無効化
- XML-RPCの無効化
- WordPressバージョン情報の非表示
いずれも重要な内容になりますので、ぜひ当記事をご活用いただければと思います。
それでは、それぞれ解説していきます。
WP REST API を無効にする
rest_authentication_errors
フィルターを使って、REST APIの認証エラーをチェックし、ユーザーがログインしていない場合は401のエラーを返します。
これにより、未ログインのユーザーに対してREST APIへのアクセスを制限します。
以下のコードをfunctions.phpにコピー&ペーストしてください。
<?php
// WP REST API を無効にする json 形式のユーザーのデータ
add_filter( 'rest_authentication_errors', function( $result ) {
if ( ! empty( $result ) ) {
return $result;
}
if ( ! is_user_logged_in() ) {
return new WP_Error( 'rest_not_logged_in', 'You are not currently logged in.', array( 'status' => 401 ) );
}
return $result;
});
rest_authentication_errorsフックについては以下のURLからご確認いただけます。
注意点としては、他サイトでこのWP REST APIを使って記事一覧を表示している場合は表示されなくなってしまうので、その点だけご注意ください。
独自に定義したdisable_author_archive_query
関数とdisable_author_archive
関数を使って、URLに含まれるauthorクエリやauthorスラッグによるアクセスを制限します。
未ログインのユーザーがauthorに関する情報を取得できないようにします。
また、authorスラッグに対するリクエストは404ページにリダイレクトされます。
以下のコードをfunctions.phpにコピー&ペーストしてください。
<?php
// author=xxx 対策
function disable_author_archive_query() {
if( preg_match('/author=([0-9]*)/i', $_SERVER['QUERY_STRING'])){
wp_redirect( home_url() );
exit;
}
}
add_action('init', 'disable_author_archive_query');
function disable_author_archive() {
if( $_GET['author'] || preg_match('#/author/.+#', $_SERVER['REQUEST_URI']) && !is_user_logged_in()){
wp_redirect( home_url('/404.php') );
exit;
}
}
add_action('init', 'disable_author_archive');
initフックについては以下のURLからご確認いただけます。
XML-RPCの無効化
xmlrpc_enabled
フィルターを使ってXML-RPCへのアクセスを無効化します。
以下のコードをfunctions.phpにコピー&ペーストしてください。
<?php
// XML-RPCへのアクセスを完全にブロック
add_filter( 'xmlrpc_enabled', '__return_false' );
また、xmlrpc_methods
フィルターを使ってピンバック機能を無効化します。
以下のコードをfunctions.phpにコピー&ペーストしてください。
<?php
// XML-RPCのピンバック機能を無効化
add_filter( 'xmlrpc_methods', function( $methods ) {
unset( $methods['pingback.ping'] );
return $methods;
});
これにより、XML-RPCを利用した不正なアクセスや攻撃を防止します。
以下にxmlrpc_enabledフックとxmlrpc_methodsフックについては以下のURLからご確認いただけます。
WordPressバージョン情報の非表示
wp_generator
アクションを使って、WordPressのバージョン情報を含むmetaタグを非表示にします。
これにより、攻撃者がWordPressのバージョン情報を取得することを防ぎます。
以下のコードをfunctions.phpにコピー&ペーストしてください。
<?php
// WordPressバージョン情報の非表示
remove_action('wp_head', 'wp_generator');
wp_headフックについては以下のURLからご確認いただけます。
まとめ
当記事では以下のセキュリティ周りの実装コードについて解説いたしました。
- WP REST API を無効にする
- authorクエリの無効化
- XML-RPCの無効化
- WordPressバージョン情報の非表示
ケースバイケースではありますが、いずれもWordPressのセキュリティを考えた場合に知っておくべき内容になりますので、ぜひ当記事を通してお仕事でお役立ていただければと思います。
念の為、全てをおまとめしたコードを添付させていただきます。
以下のコードをfunctions.phpにコピー&ペーストしてください。
/*
セキュリティ対策
*/
// WP REST API を無効にする json 形式のユーザーのデータ
add_filter( 'rest_authentication_errors', function( $result ) {
if ( ! empty( $result ) ) {
return $result;
}
if ( ! is_user_logged_in() ) {
return new WP_Error( 'rest_not_logged_in', 'You are not currently logged in.', array( 'status' => 401 ) );
}
return $result;
});
// author=xxx 対策
function disable_author_archive_query() {
if( preg_match('/author=([0-9]*)/i', $_SERVER['QUERY_STRING'])){
wp_redirect( home_url() );
exit;
}
}
add_action('init', 'disable_author_archive_query');
function disable_author_archive() {
if( $_GET['author'] || preg_match('#/author/.+#', $_SERVER['REQUEST_URI']) && !is_user_logged_in()){
wp_redirect( home_url('/404.php') );
exit;
}
}
add_action('init', 'disable_author_archive');
// XML-RPCへのアクセスを完全にブロック
add_filter( 'xmlrpc_enabled', '__return_false' );
// XML-RPCのピンバック機能を無効化
add_filter( 'xmlrpc_methods', function( $methods ) {
unset( $methods['pingback.ping'] );
return $methods;
});
// WordPressバージョン情報の非表示
remove_action('wp_head', 'wp_generator');
お気軽に皆さんのご要望をお聞かせください!
どんなに些細なことでも構いません!よろしければ記事や当サイトへの「こんな記事があったら仕事とかで役に立つな〜」や「こうだったらもっと役に立つのに!」といったようなご要望等をお気軽にお聞かせください!今後のサービス改善にお役立てさせていただきます!
例1)Reactの技術記事を書いてほしい!
例2)WordPressの使い方とかを初心者向けに解説してほしい!...など