WordPressを安全運営するためのfunctions.php・wp-config.php安全対策コード例
WordPressは世界中で利用されている人気CMSですが、その分スパムコメント・不正ログイン・お問い合わせフォーム攻撃・ユーザー名推測など、さまざまな攻撃対象にもなりやすい特徴があります。
特に初期状態のまま運営すると、コメントスパムやログイン攻撃を受けやすくなる場合があります。
そのため、WordPressでは初期段階で最低限の安全対策を行っておくことが重要です。
本記事では、functions.php・wp-config.php・.htaccessを使ったWordPress安全対策コードを、初心者向けに分かりやすくまとめています。
※functions.phpを編集する前に、必ずバックアップしてください。
※子テーマのfunctions.phpに入れるのが安全です。
コメント対策
1. コメントにURLが入っていたら拒否する
コメント欄はスパム投稿の標的になりやすく、URL付きコメントを大量投稿されるケースがあります。
// コメント本文にURLが含まれていたら拒否
function my_reject_comment_with_url( $commentdata ) {
if ( preg_match( '/https?:\/\/|www\.|\.com|\.net|\.org|\.info|\.biz|\.xyz/i', $commentdata['comment_content'] ) ) {
wp_die( 'コメントにURLを含めることはできません。' );
}
return $commentdata;
}
add_filter( 'preprocess_comment', 'my_reject_comment_with_url' );
2. 日本語を含まないコメントを拒否する
// 日本語を含まないコメントを拒否
function my_reject_comment_without_japanese( $commentdata ) {
if ( ! preg_match( '/[ぁ-んァ-ン一-龥]/u', $commentdata['comment_content'] ) ) {
wp_die( '日本語を含まないコメントは投稿できません。' );
}
return $commentdata;
}
add_filter( 'preprocess_comment', 'my_reject_comment_without_japanese' );
3. コメント本文が短すぎる場合は拒否する
// 短すぎるコメントを拒否
function my_reject_short_comment( $commentdata ) {
$content = trim( wp_strip_all_tags( $commentdata['comment_content'] ) );
if ( mb_strlen( $content, 'UTF-8' ) < 10 ) {
wp_die( 'コメント本文が短すぎます。10文字以上で入力してください。' );
}
return $commentdata;
}
add_filter( 'preprocess_comment', 'my_reject_short_comment' );
4.コメントをオフにしても直接コメントPOSTに投稿される対策
// コメント機能を完全停止
add_filter('comments_open', '__return_false', 20, 2);
add_filter('pings_open', '__return_false', 20, 2);
// 既存コメント非表示
add_filter('comments_array', '__return_empty_array', 10, 2);
// wp-comments-post.php 直接アクセス遮断
function disable_comments_post() {
if (strpos($_SERVER['REQUEST_URI'], 'wp-comments-post.php') !== false) {
wp_die('Comments are closed.');
}
}
add_action('init', 'disable_comments_post');
Contact Form 7 メールフォーム対策
お問い合わせフォームは、海外スパムや営業メール、自動送信BOTの標的になりやすい場所です。
特にURL付きメッセージや日本語を含まない送信が増える場合は、functions.php側で簡易的に制限することで、不要なメールを減らせる可能性があります。
5. Contact Form 7で日本語を含まない送信を拒否する
// Contact Form 7:日本語を含まない送信を拒否
add_filter( 'wpcf7_validate_textarea', 'my_cf7_japanese_required', 20, 2 );
add_filter( 'wpcf7_validate_textarea*', 'my_cf7_japanese_required', 20, 2 );
add_filter( 'wpcf7_validate_text', 'my_cf7_japanese_required', 20, 2 );
add_filter( 'wpcf7_validate_text*', 'my_cf7_japanese_required', 20, 2 );
function my_cf7_japanese_required( $result, $tag ) {
$name = $tag->name;
$value = isset( $_POST[$name] ) ? trim( wp_unslash( $_POST[$name] ) ) : '';
if ( $value !== '' && ! preg_match( '/[ぁ-んァ-ン一-龥]/u', $value ) ) {
$result->invalidate( $tag, '日本語を含めて入力してください。' );
}
return $result;
}
6. Contact Form 7でURL入りメッセージを拒否する
// Contact Form 7:本文にURLが含まれていたら拒否
add_filter( 'wpcf7_validate_textarea', 'my_cf7_block_url', 20, 2 );
add_filter( 'wpcf7_validate_textarea*', 'my_cf7_block_url', 20, 2 );
add_filter( 'wpcf7_validate_text', 'my_cf7_block_url', 20, 2 );
add_filter( 'wpcf7_validate_text*', 'my_cf7_block_url', 20, 2 );
function my_cf7_block_url( $result, $tag ) {
$name = $tag->name;
$value = isset( $_POST[$name] ) ? trim( wp_unslash( $_POST[$name] ) ) : '';
if ( preg_match( '/https?:\/\/|www\.|\.com|\.net|\.org|\.info|\.biz|\.xyz/i', $value ) ) {
$result->invalidate( $tag, 'URLを含む内容は送信できません。' );
}
return $result;
}
WordPressの動作や機能の対策
7. ログイン画面のエラーメッセージを曖昧にする
通常は「ユーザー名が違う」「パスワードが違う」が分かるため、攻撃者にヒントを与えます。
// ログインエラー表示を曖昧にする
function my_login_error_message() {
return 'ログイン情報が正しくありません。';
}
add_filter( 'login_errors', 'my_login_error_message' );
8. WordPressのバージョン情報を非表示にする
WordPressのバージョン情報が見えていると、古いバージョンを狙った攻撃対象になる場合があります。
// WordPressバージョン情報を非表示
remove_action( 'wp_head', 'wp_generator' );
9. 管理画面以外で絵文字用スクリプトを停止する
軽量化にもなります。
// 絵文字関連スクリプトを停止
remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
remove_action( 'wp_print_styles', 'print_emoji_styles' );
remove_action( 'admin_print_scripts', 'print_emoji_detection_script' );
remove_action( 'admin_print_styles', 'print_emoji_styles' );
10. REST APIのユーザー情報を見えにくくする
REST APIからユーザー情報が取得されると、ログインID推測のヒントになる場合があります。
REST APIとは、WordPress外部連携用機能です。
便利な反面、一部環境ではユーザー情報取得へ利用される場合があります。
// REST APIでユーザー一覧を取得されにくくする
function my_disable_rest_users( $result, $server, $request ) {
$route = $request->get_route();
if ( strpos( $route, '/wp/v2/users' ) === 0 && ! current_user_can( 'list_users' ) ) {
return new WP_Error(
'rest_forbidden',
'ユーザー情報は取得できません。',
array( 'status' => 403 )
);
}
return $result;
}
add_filter( 'rest_pre_dispatch', 'my_disable_rest_users', 10, 3 );
11. 著者ページへのアクセスをトップへリダイレクト
ユーザー名推測対策です。
// 著者アーカイブをトップページへリダイレクト
function my_redirect_author_archive() {
if ( is_author() ) {
wp_redirect( home_url() );
exit;
}
}
add_action( 'template_redirect', 'my_redirect_author_archive' );
12. wp-config.phpに入れる安全設定
functions.phpではなく、wp-config.php に入れるものです。
管理画面からテーマ・プラグイン編集を禁止
wp-config.phpには、データベース接続情報などWordPressの重要な設定が含まれています。そのため、外部から直接アクセスされないように保護しておくことが重要です。
WordPressでは、管理画面からテーマやプラグインのPHPを直接編集できます。
しかし、万が一管理画面へ不正ログインされた場合、その機能を悪用され、サイト改ざんへ繋がる危険があります。
define( 'DISALLOW_FILE_EDIT', true );
これはかなりおすすめです。
万が一ログインされても、管理画面から直接PHPを改ざんされにくくなります。
.htaccessに入れる安全設定
13. xmlrpc.phpを停止
xmlrpc.phpはブルートフォース攻撃に悪用されるケースがあり、使用していない場合は停止推奨です。
xmlrpc.phpは、WordPress外部投稿機能の一つです。
現在は使われないケースも多く、攻撃対象になる場合があるため、使用していない場合は停止がおすすめです。
<Files xmlrpc.php>
Require all denied
</Files>
14. wp-config.phpを保護
<Files wp-config.php>
Require all denied
</Files>
15. uploads内でPHPを実行させない
/wp-content/uploads/ 内に .htaccess を置きます。
uploadsフォルダは画像やファイルを保存する場所ですが、万が一不正なPHPファイルを置かれると、そこから悪用される危険があります。画像アップロード用フォルダではPHPを実行させない設定にしておくと安全性が高まります。
<FilesMatch "\.php$">
Require all denied
</FilesMatch>
なお、サーバー環境やテーマ、利用プラグインによっては、同じコードでも動作が異なる場合があります。
設定前には必ずバックアップを取り、可能であればテスト環境やアクセスの少ない時間帯で確認することをおすすめします。
本記事で紹介したコードには、functions.phpに追加するもの、wp-config.phpに追加するもの、.htaccessに追加するものがあります。
設置場所を間違えるとサイトが正常に動作しない場合があるため、必ず記述先を確認してから設定してください。
functions.phpの編集ミスは、サイトが真っ白になる原因になります。
必ずバックアップを取り、可能であれば子テーマ側に記述してください。
サーバーのWAFにより保存時に403エラーが出る場合があります。
その場合は一時的にWAFをOFFにして保存し、作業後は必ずONに戻してください。
WordPressの安全設定は、使用テーマによって最適解が変わります。特にfunctions.php、SEO設定、高速化、広告管理、コメント表示はテーマ側の機能と重複しやすいため、導入前にテーマの公式マニュアルを確認することが重要です。
初心者ほど親テーマに直接書いてしまいがちですが、テーマ更新でコードが消える原因になります。
実運営では、「子テーマ」または「Code Snippets」を使う方が安全です。
WordPressの安全対策は、functions.phpだけで完結するものではありません。
サーバー設定、WAF、ログイン管理、テーマ更新、プラグイン更新、バックアップ体制など、サイト全体で安全性を高めることが重要です。
特にWordPressは人気CMSのため、自動攻撃対象になりやすい特徴があります。初期段階から最低限の安全対策を行い、安全なサイト運営を心がけることが大切です。

