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

更新: 2021/02/23 2229文字

【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の特定のリクエストに対してアクションフックかける』というのもあったので、時間があったらやってみます。

WordPressサイト制作&リニューアル・機能開発サービス | アトリエSS


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

関連記事

【WordPress】記事文字数のカウント方法(コア機能・プラグイン)チェックと、フロントへの出力について
【ユーザーデータ取得】WordPress定義済み関数の『get_userdata()』『wp_get_current_user()』ってどのように違うの?
【WordPress更新情報表示】php/wp組み込みファンクション(fetch_feed)で取得と、プラグインで表示どちらが良い?
【WordPress組み込み関数】is_home()とis_front_page()って同じ?→似てますが、厳密には挙動が異なります
【画像つきでわかりやすい】WordPressで使われるデータは、MySQLデータベースに、どのように格納されているの?
【PHP/SQLiteでCMS作ってみる】SQLiteデータベース管理ツール『phpLiteAdmin』セットアップや日本語化・テーブル作成やってみた
【PHP】カウントダウン機能に使える?array_reverseで配列要素を逆に,パラメーター挙動&array_flipとの違い
WordPressユーザーが覚えると便利な条件分岐~投稿記事・固定ページ指定して表示/非表示
【PHPプログラミング】glob関数を使って、特定ディレクトリ内のファイル一覧取得や、出力を行う方法
YouTube Data APIを使って、PHPで『タイトル・動画id・サムネイル画像』などを取得してみる(Search: listリソース)
【超危険】WordPressデータベースリビジョンお掃除
【PHPプログラミング】ヒアドキュメント構文 (“<<<“)使ってみた例~メール確認画面&入力内容などの変数渡し