動画制作・映像制作のご相談なら。岡山を中心に全国対応。

.htaccessが勝手に戻る!WordPress改ざんの原因・復旧・再発防止

代表社員 廣瀬高之

こんにちわ、クセの強い映像制作会社「トビガスマル」代表の廣瀬です。ある朝、うちのサイトが編集マンの気分転換みたいに別世界へワープ。調べてみると、犯人は——.htaccessが勝手に戻るという怪奇現象でした。

index.phpが何度でも転生し、サーバーの外側には「.htaccess/wp-blog-header.php(3KB)/wp-cron.php(3KB)」の三点セットが潜伏。極めつけは管理者欄に紛れ込んだAl1wpadmin(エルとイチの見分けクイズ)。映画なら笑えるけど、現実は笑えない。

そこで我々は、wp-admin/wp-includesを丸ごと入替uploadsでPHP実行禁止鍵(SALT)総入替の三段カットで反撃。この記事では「なぜ飛ぶのか」「どう止めるか」「二度と撮り直し(再感染)しないために」を、実録ベースでテンポよく解説します。準備よろしい?本番、よーい——セキュリティ!

こうして事件は始まった:症状チェック(リダイレクト/ログイン不可)

まず疑うべきサイン(“それ、改ざんかも”リスト)

  • トップや特定ページを開くと、見知らぬ外部サイトへ自動リダイレクトされる(時々・毎回・端末によって違う)。
  • /wp-login.php が真っ白/404/別サイトに飛ぶ(管理画面に入れない)。
  • .htaccess を直しても数十秒で元に戻る(いわゆる“巻き戻り”)。
  • index.php異常に大きい、もしくは勝手に再生成される。
  • サイトのどこかで英語の“安全ではありません”“your site is hacked”的な文言や怪広告が出る。

一次切り分け(3分でできる“犯人は誰だ”テスト)

  1. シークレットウィンドウ+別回線で確認(スマホの4G/5Gや別Wi-Fi)。ブラウザ拡張やキャッシュ要因を除外。
  2. URL直叩きで挙動を比較:
    /(トップ)/ /wp-login.php/robots.txt/sitemap.xml
    → ログインだけ飛ぶ?全部飛ぶ?で“.htaccess改ざん”か“アプリ側”かの見当がつきます。
  3. 更新日時で犯行時刻をあぶり出す:ファイルマネージャで並べ替え → 同じ時刻で一斉に変わっているフォルダをメモ。
  4. 外側フォルダ/mail/xserver_php、アカウント直下など)に
    .htaccesswp-blog-header.php(約3KB)wp-cron.php(約3KB)の“三点セット”がいないかチェック。
  5. Google Search Console があれば「セキュリティの問題」を確認(警告が出ることがあります)。

“現場保存”のために今すぐやること

  • スクショ:リダイレクト先URL、エラーメッセージ、更新日時一覧を撮っておく。
  • バックアップ確保/public_html をZIPでDL、DBをエクスポート(のちの比較に必須)。
  • アクセス制限で封鎖(一時):ベーシック認証を /public_html に設定 or 一時的に .htaccessRequire all denied に。

やりがちなNG(被害拡大スイッチ)

  • プラグイン大量インストールで“なんとなく”直そうとする(原因が増殖します)。
  • .htaccessを何度も上書きだけして終了(書き戻しの発信源が外側に残ると無限ループ)。
  • 管理者パスワードを後回し(復旧中にまた入られることがあります)。

プロっぽい確認メモ(必要なら)

  • サイズで違和感:正しい index.php は数百バイト程度。巨大化していたら要注意。
  • .htaccessの怪文書<FilesMatch>php/phtml/exe/suspected を許可していたら改ざんパターン。
  • ログイン不可の切り分け/wp-login.php だけNG=WAF/リダイレクト細工の可能性、全ページNG=.htaccess or ルート改ざんの可能性高。

改ざんのサイン:.htaccess・index.php・偽ファイルの見分け方

危険な .htaccess の例(見たら即アウト)

  • <FilesMatch>php / phtml / exe / suspected など本来ブロックすべき拡張子を許可している。
  • 存在しないはずのファイル名をピンポイントで Allow(例:wp-confiq.phpwp-crom.php など“q”“m”の置換)。
  • やたら長い正規表現や大文字小文字混在の拡張子列(例:Php|PHp|pHp…)。
  • 権限が 444/555 固定で編集できない(ロックして書き戻しに使う典型)。

正常な .htaccess(WordPress 既定)は下記だけです:

<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> 

index.php の判定(サイズと中身で即わかる)

  • 正常:数百バイト。中身はほぼこれだけ。
    <?php define('WP_USE_THEMES', true); require __DIR__ . '/wp-blog-header.php'; 
  • 改ざん:数KB〜数百KB以上に巨大化/意味不明な難読(base64_decodeevalgzinflate など)が並ぶ/勝手に再生成される。

“偽ファイル”の典型と居場所

  • wp-blog-header.php(約3KB)・wp-cron.php(約3KB)がpublic_html の外側(例:/mail//xserver_php/、アカウント直下)に出現。
  • wp-admin配下のランダム名の大型PHP(1MB前後)+同階層の .htaccess(555)
  • テーマの functions.php 末尾にユーザー自動作成やリモート実行っぽいコード(wp_insert_usereval 等)。

チェックの進め方(3分クイック点検)

  1. ルート(/public_html)の .htaccess を開き、上の「正常版」と一致するか確認。
  2. ルートの index.phpサイズ先頭数行を確認(巨大・難読ならアウト)。
  3. 外側フォルダ/mail//xserver_php/、アカウント直下 など)で
    .htaccesswp-blog-header.phpwp-cron.php」の三点セットを検索。
  4. wp-admin/ 直下〜下層に不審な大きいPHP.htaccess が無いかを一覧ソートで確認。

見つけたらどうする?(ミニ初動)

  • 権限を 644 に変更してから不審ファイルを削除(444/555 のままでは消せない)。
  • ルートの .htaccess は正常版に戻し、様子見後に444でロック
  • 併せて wp-admin / wp-includes公式パッケージで丸ごと入替を前提に。

犯人は“三点セット”|外側に潜む .htaccess/wp-blog-header.php/wp-cron.php

三点セットとは?(正体と役割)

改ざん時にpublic_htmlの外側へばら撒かれる、下記の不審ファイル三兄弟です。

  • .htaccess … 実行許可やリダイレクトを仕込み、復旧を巻き戻す司令塔。
  • wp-blog-header.php(約3KB) … 本物を装った偽ファイル。外側から読み込ませる踏み台。
  • wp-cron.php(約3KB) … タイマー役。一定間隔で巻き戻し処理を起動。

この3つが外側に生きていると、ルートの .htaccessindex.php を直しても数十秒〜数分で再汚染されます。

どこに潜む?(よくある隠れ家)

  • アカウント直下(例:/xs123456.xsrv.jp/ の直下)
  • /mail/ 配下(MaildirMaildir.1 など各ユーザー箱)
  • /xserver_php//xserver_php/session//autoreply/
  • /log//htpasswd//script/ など管理系フォルダ

目印:更新日時が同一(例:19:01〜19:03に集中)、サイズが約3KB.htaccess の権限が 444/555 固定。

なぜ巻き戻るのか(仕組みの超要約)

  1. 外側の .htaccess許可ルールを設定(危険拡張子の実行許可)。
  2. wp-cron.php が偽物の wp-blog-header.php を通じて定期実行
  3. ルートの .htaccessindex.php上書き再生成 → 復旧が無効化。

安全な除去手順(順番厳守)

  1. フォルダ単位で巡回:上の「隠れ家」を一つずつ開く。
  2. 権限解除:各ファイルのパーミッションを 444/555 → 644 に。
  3. 削除.htaccesswp-blog-header.phpwp-cron.phpすべて削除。消せなければ .bad へリネーム。
  4. ルート整備/public_html/.htaccess正常版へ戻し、様子見の後に 444 でロック。
    <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> 
  5. 観察:30〜60秒待って、.htaccess自動改変が止まったことを確認。

消せない時の対処(最終手段)

  • フォルダ隔離:親フォルダごと *.bad にリネーム → 新規フォルダをアップ。
  • 復元の粒度を落とす:自動バックアップの「対象を指定して復元」で該当フォルダのみ感染前日に戻す。
  • サポートに権限リセット依頼:所有者/権限不整合で削除不可な場合は運営に解除依頼。

削除後にやる最小セット(再発防止)

  • wp-admin/wp-includes公式パッケージで丸ごと入替
  • wp-content/uploads/.htaccess を作成しPHP実行禁止
  • 管理者パスワード総入替wp-config.phpAUTH_KEY/SALT 再生成

wp-adminの地下室で見つけたウェブシェルと偽管理者(Al1wpadmin)

ウェブシェルの特徴(ここを見れば怪しい)

  • ファイル名がランダム(例:WtXAhWdV.php のような大文字小文字混在)。
  • サイズが異常(1MB前後など巨大。通常のWP管理系PHPは数KB〜数十KB)。
  • 同階層に.htaccess(555/444)が置かれ編集不可になっている。
  • 中身に base64_decode / eval / gzinflate / str_rot13 などの「難読化関数」が並ぶ。

安全な駆除手順(wp-admin 配下)

  1. 隔離/wp-adminwp-admin.bad にリネーム(フォルダごと隔離)。
  2. 正規品で置換:WordPress公式パッケージから新しい wp-admin/ を丸ごとアップ。
  3. 関連ロック解除:隔離先(wp-admin.bad)内の怪しい .php.htaccess555→644 にしてから削除。
  4. コア補強:同時に wp-includes/ も公式で丸ごと入替、ルートの
    index.php / wp-blog-header.php / wp-cron.php / wp-load.php / wp-settings.php を上書き。

偽管理者「Al1wpadmin」の見抜き方と削除

  • 見抜き方Al1wpadmin(エルとイチ混在)/見覚えのない管理者メール(例:al1wpadmin@gmail.com)。
  • UIでの削除手順:ユーザー一覧→該当ユーザーを購読者に変更→更新→削除(投稿は正規管理者に譲渡)。
  • SQLでの削除(消えない場合):phpMyAdmin でIDを確認→wp_usermetawp_users の順に削除。

“鍵の総入替”で後始末

  1. 全管理者のパスワード変更(強力なランダムへ)。
  2. SALT再生成wp-config.phpAUTH_KEY/SALT 8行を新規値で置換→全セッション強制ログアウト。
  3. アプリケーションパスワード(ユーザープロフィール最下部)を全消去。
  4. 管理用メール(設定→一般)が攻撃者アドレスに変わっていないか確認。

発見を早めるコツ(運用の型)

  • 更新日時ソートwp-admin/wp-includes/ を定期巡回(同時刻に一斉更新は要注意)。
  • テーマの functions.phpmu-pluginsユーザー作成コードwp_insert_user 等)がないか検索。
  • ログイン試行回数制限・ベーシック認証を /wp-login.php / /wp-admin に導入(Xサーバーのアクセス制限で可)。

復旧の全手順:最短でサイトを戻すチェックリスト

A. 初動(5分で封じ込め)

  1. アクセス遮断:一時的に /public_html/.htaccess を以下で保存(復旧後に戻す)。
    Require all denied
  2. Cron停止:サーバーパネルの Cron を一旦「無効」に。
  3. バックアップ確保:現状の /public_html と DB をエクスポート(比較用)。

B. “発信源”の除去(外側フォルダの三点セット)

  1. 以下の場所を一つずつ開き、.htaccesswp-blog-header.php(約3KB)wp-cron.php(約3KB) を発見次第、権限 444/555 → 644 に変更して削除
    • アカウント直下(例:/xsXXXXXX.xsrv.jp/
    • /mail/**Maildir, Maildir.1 など各ユーザー箱)
    • /xserver_php/, /xserver_php/session/, /autoreply/
    • /log/, /htpasswd/, /script/
  2. 削除できなければ ファイル名を *.bad にリネーム → サポートへ「所有者/権限リセット」依頼。

C. コアの“正規入替”(手動で盤石に)

  1. wp-admin 交換:既存 /wp-adminwp-admin.bad にリネーム → 公式パッケージの wp-admin/ を丸ごとアップ。
  2. wp-includes 交換:同様に公式の wp-includes/ を丸ごとアップ。
  3. ルートのコア上書きwp-blog-header.php / wp-cron.php / wp-load.php / wp-settings.php を上書き。
  4. index.php 再作成(数百Bが正解):
    <?php define('WP_USE_THEMES', true); require __DIR__ . '/wp-blog-header.php'; 
  5. 権限の目安:ディレクトリ 755 / ファイル 644

D. .htaccess 整備(短く・堅く)

  1. ルート:下記だけにして保存 → 様子見して問題なければ 444 に固定。
    <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> 
  2. uploads 実行禁止/wp-content/uploads/.htaccess を新規作成(444)。
    <FilesMatch "\.(?:php|phtml|php5|php7|php8|phps|pht|shtml|cgi|pl|py|exe|suspected)$"> Require all denied </FilesMatch> 

E. ログイン後の“鍵の総入替”

  1. 全管理者のパスワード変更(強力なランダム)。
  2. SALT再生成wp-config.phpAUTH_KEY/SALT 8行を新しい値に置換(全セッション強制ログアウト)。
  3. 見知らぬ管理者削除(例:Al1wpadmin)。アプリケーションパスワードがあれば全削除。

F. 仕上げ(更新・再発防止)

  • WP本体/テーマ/必要プラグインを最新に。不要は削除。
  • WordPressセキュリティ設定(Xサーバー):ログイン試行制限ON/XML-RPC制限ON(未使用なら)。
  • /wp-login.php・/wp-admin にベーシック認証(アクセス制限機能で追加)。
  • 1週間はときどき更新日時ソートで「外側フォルダ」を巡回し、再出現がないか確認。

G. 合格サイン(ここまで来たらOK)

  • /public_html/.htaccess勝手に改変されない
  • ルートの index.php勝手に肥大化・再生成しない
  • トップページと /wp-login.php正常表示

バックアップ復元のコツ:Web+DB+外側フォルダを同日に戻す

なぜ「同日」復元が重要?

  • 整合性の確保:ファイルとDBのズレ(URLやリダイレクト設定)が原因の不具合を防ぐ。
  • 書き戻しの遮断:外側フォルダ(/mail/xserver_php 等)に潜む不正ファイルも同日に戻し、再汚染を止める。
  • 原因追跡の明瞭化:同じスナップショットに戻すと、ログとの突合が楽になる。

Xserverでの基本手順(対象を指定して復元)

  1. Web領域(/public_html)を改ざん前日付に復元。
  2. 同画面または続けて、外側フォルダも同日に復元:
    /mail/xserver_php/xserver_php/session/autoreply /(あれば)/log/htpasswd・アカウント直下 など。
  3. MySQLデータベースを同じ日付で復元(別タブ)。

ポイント:「すべてを復元」はメールまで巻き戻すため、通常は“対象を指定”で必要箇所だけ戻す方が安全。

復元が重い/止まる時のコツ

  • 粒度を落とす:/public_html/wp-admin/wp-includes → 残り、と順に小さく復元。
  • 空き容量の確保:/wp-content/cache などを手動削除してから再実行。
  • 同時実行しない:復元ジョブの多重実行はキュー渋滞の元。履歴タブで状態を確認。

復元“後”の必須仕上げ(再汚染防止)

  1. WordPressコアを公式で上書き:wp-admin/wp-includes/ を丸ごと入替。ルートの index.php ほかコアPHPも上書き。
  2. .htaccess整備:ルートは正常版にして444固定、wp-content/uploads/.htaccessでPHP実行禁止。
  3. 鍵の総入替:全管理者のPW変更+wp-config.phpAUTH_KEY/SALT を再生成。

差分データの取り扱い(注意点)

  • 復元日以降の投稿・問い合わせ・受注は消える可能性。必要ならバックアップ前にエクスポート、復元後に再投入。
  • 会員サイトの場合は、新規ユーザーや更新分の差分を確認して追補。

合格チェック(復元が効いているサイン)

  • 30〜60秒待っても /public_html/.htaccess勝手に改変されない
  • ルートの index.php勝手に再生成・肥大化しない
  • トップと /wp-login.php正常表示

再発防止の実践:uploadsでPHP禁止/鍵の総入替/Xserver設定

1) アップロード領域で「PHP実行禁止」

/wp-content/uploads/ はユーザーが書き込めるため、ここを守るだけで被害の大半を未然に防げます。

  1. /wp-content/uploads/.htaccess を新規作成し、下記を保存(権限444)。
<FilesMatch "\.(?:php|phtml|php5|php7|php8|phps|pht|shtml|cgi|pl|py|exe|suspected)$"> Require all denied </FilesMatch> 
  • 同様に、フォーム系プラグインの保存先(例:/wp-content/uploads/forminator/ 等)にも配置推奨。

2) “鍵の総入替”でセッション一掃

  1. 全管理者のパスワード変更(長いランダム/使い回し厳禁)。
  2. SALT再生成wp-config.phpAUTH_KEY/SALT 8行を新しい値で置換(全ユーザー強制ログアウト)。
  3. アプリケーションパスワード(ユーザープロフィール最下部)を全削除。
  4. 見知らぬ管理者の掃除(例:Al1wpadmin)と、管理用メールの差し替え有無を確認。

3) Xserver側の防御設定(推奨値)

  • WordPressセキュリティ設定:ログイン試行回数制限ON/XML-RPC制限ON(未使用なら)。
  • ベーシック認証/wp-login.php/wp-admin に追加(アクセス制限機能)。
  • WAF(Webアプリ防火壁):必ず有効化。誤検知が出るプラグインは個別ルールで許可。
  • 自動バックアップの確認:取得サイクルと復元手順を社内で共有。

4) プラグイン/テーマの“衛生管理”

  • 不要は削除(停止のまま放置しない)。
  • 更新を習慣化:週1回はダッシュボードで更新確認。
  • セキュリティ系は1製品に統一(WAFの二重掛けは競合の元)。

5) ログと監視のミニ運用

  • 更新日時ソートで「外側フォルダ」(/mail/xserver_php 等)を週1巡回。
  • アクセスログを月1で保存(改ざん時刻の特定に必須)。
  • Search Console のセキュリティの問題を有効化し、通知を受け取る。

6) 仕上げチェック(通過点)

  • /public_html/.htaccess勝手に改変されない(権限444のまま)。
  • index.php肥大化・再生成しない
  • 管理画面とフロントが安定表示し、エラーログに不審なPHP実行が出ない。

入口はどこだった?ログ解析で分かったこと(アクセスログの読み方)

何を見る?(改ざん直前1時間をズーム)

  • 時間帯:発生推定の前後60分(例:18:30〜19:30)。
  • 動詞:改ざんはたいてい POST で始まる。POST の宛先と繰り返し回数を注視。
  • 相手:同じIP/国からの連続アクセス(秒間〜分間で何十発)。怪しいUA(空/古いbot名)も手掛かり。

狙われやすいエンドポイント(痕跡の型)

  • /wp-login.php … 短時間の連続 POST(総当たり)→ 成功後に管理画面系へ遷移。
  • /wp-admin/admin-ajax.php … 脆弱なプラグイン経由の POST。アップロードやオプション改変の入口になりやすい。
  • /xmlrpc.phpsystem.multicall の大量連投(パスワード類推)。
  • /wp-content/uploads/… … 画像拡張子に偽装した POST/PUT → 直後の GET … .php 実行で“シェル投下→起動”。

ログの読み方(パターン別の見どころ)

  • 同一IPの連続POST:秒間〜分間で数十回。成功後に /wp-admin/ 内の色々へ GET が伸びる。
  • アップロード→実行POST /wp-admin/admin-ajax.php(またはフォーム系エンドポイント)直後に、GET /wp-content/uploads/xxx.php など実行痕。
  • 巻き戻しのトリガ:一定間隔(1〜5分)で GET /wp-cron.php(偽)や外側パスの .php にアクセス。

Xserverでの実務(生ログを狙い撃ち)

  1. サーバーパネル → アクセスログ → 対象ドメイン → 生ログ をダウンロード。
  2. PC上でテキスト検索(エディタでOK):「POST」「admin-ajax.php」「xmlrpc.php」「wp-login.php」「/uploads/」「wp-cron.php」。
  3. 怪しいIPを見つけたら、そのIPで再検索し時系列を追う(最初の一手→投下→実行→巻き戻し)。

“犯人IP”の扱い(その後に活かす)

  • .htaccessでブロック(一例/必要に応じて国やASNでの網羅も検討)
<RequireAll> Require all granted Require not ip 203.0.113.10 Require not ip 198.51.100.0/24 </RequireAll> 
  • WAFのカスタムルールやセキュリティプラグインの拒否リストにも同IPを登録。

改ざんの断面を“確定”させるチェック

  1. 最初の異常(初回 POST)の時刻とIPを特定。
  2. 投下の痕/uploads//wp-admin/ 下にファイルを置く挙動)が続くか。
  3. 起動(置いた直後にそのファイルへ GET … .php)。
  4. 恒久化(外側の三点セットや偽 wp-cron.php の周期アクセス)。

ログが欠けている/判別が難しい時

  • 復元前の生ログが無いと入口断定は難しい。取れる範囲で時系列とIPだけでも記録。
  • FTP/コンパネのログが取得できれば、外側フォルダへの直接配置の有無が分かる。
  • 不審プラグインのバージョン履歴と既知脆弱性を照合(古いアップロード系・フォーム系は要注意)。

結論の出し方(クライアント説明用の型)

時刻(例:19:01)に IP A から POST /admin-ajax.php が集中→直後に /uploads/abc.phpGET(実行)→以降、アカウント直下のwp-cron.php に周期アクセス——この流れから、プラグイン経由のファイル投下→恒久化が主因と判断。対策はプラグイン更新・uploads実行禁止・管理系強化で再発を遮断。」

よくある質問(FAQ):巻き戻り・復元時間・費用・プラグイン

Q. .htaccessがすぐ巻き戻るのはなぜ?

原因はpublic_htmlの外側に仕込まれた三点セット.htaccesswp-blog-header.phpwp-cron.php)が定期的に書き戻しているためです。外側から権限を644に→削除、その後にルートの.htaccess正常版+444で固定すると止まります。

Q. バックアップ復元だけで直る?

Web領域+DB+外側フォルダを同じ日付に戻せば基本は直ります。ただし復元“後”の穴塞ぎwp-admin/wp-includesを公式で入替、uploadsでPHP禁止、パスワード&SALT総入替)が必須。ここを省くと再発率が高いです。

Q. 復元にどのくらい時間がかかる?

データ量・空き容量・同時実行状況で変動します。/wp-content/uploadsが大きいと長引きます。進まない場合は、粒度を落として/wp-admin/wp-includes → 残り」の順で復元し、同時に手動のコア入替を進めるのが実務的です。

Q. いきなり消して大丈夫?証拠は必要?

駆除前にスクショとバックアップ(現状の/public_htmlとDB)を取得してください。証拠保全後は、三点セットやウェブシェルは即削除でOKです。

Q. 費用の目安は?

ケース次第ですが、復旧+基本対策でおおむね6.5〜9.5万円原因分析レポート込み9.5〜15.5万円が目安です。自社対応できる工程が多いほど圧縮可能です。

Q. セキュリティプラグインは何を使えば?

乗っ取り後はまず一度アンインストールし、.user.iniauto_prepend_fileやルートのmalcare-waf.php等の残存フックを除去。そのうえで1製品に絞って再導入(二重WAFは非推奨)。

Q. もう入られないために最低限やることは?

  • uploadsでPHP禁止/wp-content/uploads/.htaccess
  • wp-admin / wp-includesを公式で入替+コアPHPを上書き
  • 管理者PW変更&SALT再生成、不要プラグイン削除&更新
  • /wp-login.php と /wp-admin にベーシック認証、XML-RPC制限(未使用なら)

まとめ:今日からできる3つの予防策

1) 「書ける場所」を守る:uploadsでPHPを永久に禁止

  • /wp-content/uploads/.htaccess を配置してPHP実行をブロック(権限444)。
  • フォーム系プラグインの保存先にも同様のルールをコピー。
  • 週1回は更新日時ソートでuploads配下にPHPがいないか点検。

2) “鍵”を回す習慣:パスワード&SALTを定期更新

  • 管理者パスワードは長いランダム+使い回し厳禁、半年に一度は更新。
  • wp-config.phpAUTH_KEY / SALT を再生成(全セッション強制ログアウト)。
  • 見知らぬ管理者/アプリケーションパスワードがないか月例点検

3) 入口を狭める:Xserverの防御+基本運用

  • WordPressセキュリティ設定:ログイン試行回数制限ON/XML-RPC制限ON(未使用なら)。
  • ベーシック認証/wp-login.php/wp-admin に追加。
  • プラグイン/テーマは不要を削除・残りは常に最新に。WAFは一製品に統一
  • アクセスログは月1で保存(改ざん時刻の特定と原因追跡に必須)。

最後に:復旧は“短く正しく”

  • .htaccessは短い正規版+444、index.phpは数百Bの正しい中身
  • 巻き戻りを見たらまず外側(三点セット)を削除、次にwp-admin/wp-includesの正規入替
  • 復元後は鍵の総入替uploads実行禁止で二度目の撮り直しを防止。

ここまでやれば、次に同じ“事件”が起きても早期検知→短時間復旧が可能です。この記事が、あなたのサイトの“守りの台本”になりますように。🎬

コメント

この記事へのトラックバックはありません。

関連記事

カテゴリーで探す
TOP