WordPressのみならず、ウェブサイトのセキュリティを保つ上で欠かせないのが、.htaccessファイルへのセキュリティ対策用コードの記述です。
PHPから.htaccessへコードを追加する方法、削除するコード例
追加するコード
例として、wp-config.phpへ外部から直接アクセスできないようにするコードを紹介します。
以下のコードを有効化しているテーマのfunctions.phpへ追加します。
/*** admin_init フックで設定を確認し、.htaccess を更新する ***/
function pwcn_deny_wp_config_files_access_init() {
//追加・削除のスイッチ(1で追加、0で削除)
$is_enabled = '1';
//.htaccessファイルの場所を特定する
$htaccess_file = ABSPATH . '.htaccess';
//.htaccessが存在しない、または書き込み許可されていなければ終了
if (!file_exists($htaccess_file) || !is_writable($htaccess_file)) {
return;
}
//.htaccessの記述内から開始マーカーを取得
$content = file_get_contents($htaccess_file);
$marker_begin = '# BEGIN PWCNConfigProtection'; //開始マーカー
$has_marker = (strpos($content, $marker_begin) !== false);
// 2. 機能を有効化しているのに開始マーカーがない場合 = コードを追加
if ($is_enabled === '1' && !$has_marker) {
pwcn_add_deny_wp_config_files_access(); //追加するコールバック関数を指定する
}
// 3. 機能を無効化しているのに開始マーカーがある場合 = コードを削除
elseif ($is_enabled !== '1' && $has_marker) {
pwcn_remove_deny_wp_config_files_access(); //削除するコールバック関数を指定する
}
}
//add_action('admin_init', 'pwcn_deny_wp_config_files_access_init');
/*** .htaccessへ追加するコールバック関数 ***/
function pwcn_add_deny_wp_config_files_access() {
$htaccess_file = ABSPATH . '.htaccess';
$content = file_get_contents($htaccess_file);
//開始・終了マーカー
$marker_begin = '# BEGIN PWCNConfigProtection';
$marker_end = '# END PWCNConfigProtection';
require_once( ABSPATH . 'wp-admin/includes/misc.php' );
require_once( ABSPATH . 'wp-admin/includes/file.php' );
// 3. サーバー環境の再判定(Apache 2.4 / LiteSpeed 向けをデフォルトにする)
$server_soft = $_SERVER['SERVER_SOFTWARE'] ?? '';
// 基本は Apache 2.4 形式を使用。
// 明示的に "Apache/2.2" や "Apache/2.0" という文字列が含まれていない限り 2.4 用の記述にする。
$is_legacy_apache = ( strpos( $server_soft, 'Apache/2.2' ) !== false || strpos( $server_soft, 'Apache/2.0' ) !== false );
if ( ! $is_legacy_apache ) {
$new_rules = $marker_begin . "\n";
$new_rules .= "# wp-config.php への直接アクセスをブロック\n";
$new_rules .= "<Files wp-config.php>\n";
$new_rules .= " Require all denied\n";
$new_rules .= "</Files>\n";
$new_rules .= $marker_end . "\n";
}else{
$new_rules = $marker_begin . "\n";
$new_rules .= "# wp-config.php への直接アクセスをブロック\n";
$new_rules .= "<Files wp-config.php>\n";
$new_rules .= " Order allow,deny\n";
$new_rules .= " Deny from all\n";
$new_rules .= "</Files>\n";
$new_rules .= $marker_end . "\n";
}
//# BEGIN WordPressマーカーの前に追加(WordPressが反応する前に処理)
$target = '# BEGIN WordPress';
if (strpos($content, $target) !== false) {
$updated_content = str_replace($target, $new_rules . $target, $content);
} else {
$updated_content = $content . $new_rules;
}
file_put_contents($htaccess_file, $updated_content, LOCK_EX);
}
/*** .htaccessから削除するコールバック関数 ***/
/* 開始・終了マーカーを必ず変更すること */
function pwcn_remove_deny_wp_config_files_access() {
$htaccess_file = ABSPATH . '.htaccess';
if ( file_exists( $htaccess_file ) && is_writable( $htaccess_file ) ) {
$content = file_get_contents( $htaccess_file );
// 自前で追加したマーカー間を正規表現で削除
$pattern = '/# BEGIN PWCNConfigProtection.*# END PWCNConfigProtection\s*/s';
$new_content = preg_replace( $pattern, '', $content );
if ( $new_content !== null ) {
// 前後の余計な空行を整えて保存
file_put_contents( $htaccess_file, trim( $new_content ) . "\n" );
}
}
}
コードを追加したら、末尾の「//add_action(‘admin_init’, ‘pwcn_deny_wp_config_files_access_init’);」となっている部分のコメントアウト(//)を削除して、管理画面のリロードをすれば.htaccessへコードが追加され、手動で削除しても管理画面をリロードする度にチェックして追加されるようになります。
コードを有効化する前に.htaccessファイルのバックアップを必ず行ってください
コードの解説
.htaccessはサーバー内のその場所の配下にある場所すべてに影響のあるファイルであり、このページで紹介している方法はある程度コードに理解のある方向けの情報となりますので、簡易的に解説しておきます。
上記のコードでは以下のような形で.htaccessの追加と削除を行うようになっています。
- 追加・削除のスイッチ($is_enabled = ‘1’;または$is_enabled = ‘0’;)で追加するプログラムを呼び出すか、削除するプログラムを呼び出すかを判断
- .htaccessファイルの内容を取得して、「# BEGIN PWCNConfigProtection」という記述があるかを判断して記述がなければpwcn_add_deny_wp_config_files_access()関数を呼び出して追記する(その際には「# BEGIN WordPress」の記述よりも上、つまりWordPressが反応する前に追加して機能させる)
- .htaccessファイルの内容を取得して、「# BEGIN PWCNConfigProtection」という記述があり、$is_enabled = ‘0’;だったら、pwcn_remove_deny_wp_config_files_access()を呼び出して、# BEGIN PWCNConfigProtection~# END PWCNConfigProtectionまでを削除する
今回はテーマのfunctions.phpへ追加する前提で紹介していますが、自作プラグインなどに追加して、設定画面で$is_enabled = ‘1’;または$is_enabled = ‘0’;という値をoptionsテーブルに保存し、それを判断材料としてコードを追加・削除するという使い方がよいと思います。
.htaccessの仕様上これらのコードはメインディレクトリに設置すれば基本的に子ディレクトリすべてに反映されるので、親ディレクトリにWordPressがインストールされていて、子ディレクトリに別のWordPressがインストールされている場合、親子双方のサイトに適用されます。
あまりないケースだとは思いますが、親ディレクトリのサイトのみに適用させたい場合は、親ディレクトリのサイトにはに追加するコードを、子ディレクトリには削除するコードを設置すればうまくいくと思います。
プラグインで使用する際、プラグインの停止と同時に自動削除させたいときは
本ページのコードのユースケースとしては、自作のプラグインで設定画面に応じて有効/無効にする形が多いでしょう。
前述のコード+設定画面での有効化/無効化で.htaccessファイルへの記述の追加・削除はできるようになりますが、プラグインを使用しなくなった時に遺恨を残さず削除されるよう、以下のコードを追加しておくといいでしょう。
/*** プラグイン停止時に .htaccessから削除するコールバック関数を呼び出して処理する ***/
register_deactivation_hook( __FILE__, 'pwcn_remove_deny_wp_config_files_access' );
別のコードを追加した時は
このコードを流用して別のコードを.htaccessファイル内に追加・削除させたい場合にはコード中の以下の部分を変更します。
- BEGIN PWCNConfigProtection、# END PWCNConfigProtectionという開始・終了コメントの部分をすべて別名に変える
- 3つのユーザー定義関数名を変更する。また、最初のコードで呼び出す追加・削除関数も変更する
- 出力するコードを変更する(今回のコード例ではApacheのバージョンによる振り分けをしていますが、不要であればその部分は削除します)











コメントを残す