webコンテンツを徹底強化!WordPressサイト制作とプラグイン&テーマ情報・メンテ/エラー対応から、PHP/CSS/javascript、動画・音・イラスト等制作まで扱うコラム
マルチメディアコンテンツ制作読んどけ☆コラム

【WPユーザー名バレ対策】ユーザー名表示からPHP・preg_matchでリダイレクト(wp-json/wp/v2/usersなど)

      2021/02/23

【WPユーザー名バレ対策】ユーザー名表示からPHP・preg_matchでリダイレクト(wp-json/wp/v2/usersなど) 今回は、WPログインなどにも使われる情報『ユーザー名』が表示されてしまうページに、正規表現でリダイレクトをかけてみます。セキュリティ上、あまり表に出したくないケースもあると思うので、さっそくみていってみましょう。

WordPressユーザー名バレがよろしくない理由や、バレるポイントになるページは?

通常のログインだと『ユーザー名・パスワード』を使いますが、ユーザー名が先に特定されている場合『あとは総当たり攻撃(ブルートフォースアタック)を試すだけ』という形になります。このとき、簡単なパスワードを設定していると、抜けられるリスクが高いです。ユーザー名がわからないほうが、攻撃者はログインしにくくなります。

見られるだけならまだしも、改ざんされたりしたら、たまったものではありません。 (実際、管理人も、他制作会社のサイトで、海外のエロ動画サイト広告を仕込まれたサイトを見たことがあります。あれは切なかったです。

WordPressユーザー名バレケース1:〇〇(ドメイン)/wp-json/wp/v2/users

WordPress REST API絡みの機能です。コンテンツを簡単に取得する仕組みらしいんですけど、上記のアドレスにアクセスすると、ユーザー情報が見えてしまいます。 ちなみに『〇〇(ドメイン)/wp-json/wp/v2/posts』だと、投稿記事情報を取れます。

なるべくなら見せたくないんですけど、一部の有名プラグインやコア機能などがWordPress REST APIと連携しているため、完全に無効化というのは厳しい(作動しないから)です。一般公開しているコンテンツは見られても、ユーザー情報は隠したほうが安全ですね。

WordPressユーザー名バレケース2:ユーザーの一覧表示(〇〇(ドメイン)/?author=〇〇)

こちらは結構有名なので、ご存じの人も多いかも。『基本パーマリンクの場合は〇〇(ドメイン)/?author=〇〇』でアクセスすると、『そのユーザーの記事一覧が出る』という機能。しかしこのとき、ログイン用のユーザー名も出てきてしまうので、注意が必要です。

このアドレスはパーマリンク設定ごとに変わっていて、例えば管理人の場合だと『archives/author/〇〇(ユーザー名)/』という形式になっていました。これもバレはあまりよろしくないので、対処してみました。

PHP・preg_match&リダイレクトで、ユーザー名表示するページを見られないようにしてみる

コード(functions.php)

動作検証は『PHP7.3モジュール・WP5.5』でした。管理人のサイトのfunctions.phpに書いてみたところ大丈夫でしたが、こういうのをやる場合は、バックアップをすぐFTPから上げられるようにしておくと安全です。どちらもpreg_matchとwp_redirectを使っています。ファンクション名はお好みで(完全に無効化するわけじゃないのに、間違ってdisableにしてしまいました涙)。

〇〇(ドメイン)wp-json/wp/v2/usersにアクセスした場合のリダイレクト

$_SERVER['REQUEST_URI'](現在アクセスしているドメイン以下のページ)内に、preg_match(正規表現マッチング)で『wp-json/wp/v2/usersが入っているか』で判定。urlのスラッシュについている¥マーク(gist上ではバックスラッシュ)は、記号のエスケープ用です。アドレスに文字列が入っている場合は、wp_redirect(リダイレクト用のWP関数・301などのパラメータもつけられる・初期値は302)で、トップページに飛ばします。

ユーザーの一覧表示(管理人の場合 〇〇(ドメイン)/archives/author/〇〇(ユーザー名)/)

これは別に、WP組み込みの『if (is_author() ) 』とかでやってもいいと思うんですけど、基本スラッグにauthorみたいな文字列は使わなかったから、preg_matchで判定でもリダイレクトできました。管理人の場合はパーマリンクの関係上『/archives/author/〇〇(ユーザー名)』となっているので、設定に応じて変更します。

あとがき・まとめ

  • ログイン用ユーザー名がわからないほうが、安全性は高い
  • WordPressには、ログイン用ユーザー名が表示されてしまうページがある
  • preg_match正規表現マッチングやis_author()による条件でリダイレクトなどができる

まとめるとこのような感じでした。ログイン用ユーザー名がわかるページでリダイレクトかけるだけだと、100%安全というわけではないですが、ある程度攻撃のリスクを下げることはできます。ちょっと調べたところ、『REST APIの特定のリクエストに対してアクションフックかける』というのもあったので、時間があったらやってみます。


【カテゴリ】 - PHP・データベースetc
【タグ】 - , , , ,

  関連記事

【WordPressで覚えよう】PHP「->」(オブジェクト演算子/アロー演算子)・「=>」(ダブルアロー演算子)の違い

今回は、管理人もPHP学習し始めのときは混同していた、PHPの演 ...

【超危険】WordPressデータベースリビジョンお掃除

今回は、WordPressのリビジョンが、データベースに大量にた ...

【PHP】カウントダウン機能に使える?array_reverseで配列要素を逆に,パラメーター挙動&array_flipとの違い

今回は、管理人がYouTubeData APIの、order=d ...

YouTube Data APIを使って、PHPで『タイトル・動画id・サムネイル画像』などを取得してみる(Search: listリソース)

今回は、youtubeとwebサイト連携で、YouTube Da ...

テスト環境(ローカル含む)でPHPサイト開発に使えるツール&xamppでやってみた例(設定や表示ファイルetc)

今回は、管理人がサイトに、ちょっとした機能を実装しようとしていた ...

WordPress一覧表示で、特定のカテゴリ/投稿を表示しないようにするには?→category_not_in・post_not_inで

今回は、WordPressの公式フォーラムを見ていたら、『一覧か ...

WordPress・REST APIのjsonファイルにカスタムフィールドを入れ、タイトル・アイキャッチと共に外部サイトで取得・表示

今回は、管理人がWPで作ったサイトのコンテンツを、別の自社運営サ ...