WordPressで投稿者アーカイブを出力させないようにする方法

はっきりとした事は不明だがWordPress日本語フォーラムの以下の報告を皮切りに改ざん報告がちらほらと見受けられる。

WordPress › フォーラム » サイト改ざん?

Googleの検索結果では2011年くらいにも同様の事例が引っかかるので、今に始まったわけじゃないようだが、ここ半年くらい、特にここ数週間は顕著なようだ。

今後、ロリポップやhetemlから何らかのアナウンスがあるんじゃないかと思うが、そんな中、node.jsをいじろうと思って契約したものの、全くいじっていないGehirn Web ServicesからWordPressの不正アクセスに関するメールが届いたため、一部抜粋して転載する。

日本時間の2013年8月28日 午後3時頃より、平常時よりも大量の WordPress ログインを試みる不正なアクセスが検出されています。
現在、弊社の分析局で攻撃手法や特徴を分析しております。

弊社の分析によりますと、 /?author=1 にアクセスすることで使用しているユーザー名が分かることから、 デフォルトの admin アカウント以外のユーザ名を設定されているお客様にも影響があると見られ、十分に注意が必要です。

ということで、どうやらWordPressの投稿者アーカイブが狙われているっぽいので、これを無効化するコードを二つ程紹介する。

投稿者アーカイブを非表示にする

以下のコードをテーマの functions.php に突っ込むとauthorクエリ(?author=xxx)を無効化して404を返すようになる。

function disable_author_archive($q) {
  if ( $q->is_admin ) {
    return $q;
  }elseif ( $q->is_author ) {
    unset( $_REQUEST['author'] );
    $q->set( 'author', '' );
    $q->set_404();
  }
}
add_action('parse_query', 'disable_author_archive');

参考:Disable the WordPress Public Search

上記の参考先では ?s= の検索クエリを無効化するものなので、気になる人はついでに利用すると良いんじゃないかと思う。

あるいは以下のコードでURLに author が含まれた場合、どこか適当なページにリダイレクトさせるようにする。

function redirect_author_archive() {
  if( isset($_REQUEST['author']) || preg_match('#/author/.+#', $_SERVER['REQUEST_URI']) ){
    wp_redirect( home_url( '/404' ) ); //リダイレクト先
    exit;
  }
}
add_action('init', 'redirect_author_archive');

参考:WordPress › フォーラム » セキュリティ向上:ログインIDをURLにしたくない

他にもプラグインで対応可能かもしれない。

IT起業アカデミア