【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フィールド画像取得】array_push&foreachループ、代替テキストをクラス出力、表示/非表示を切り替える方法
【WP記事取得クエリ・プラグイン無し】お知らせなどに使える、ショートコードで特定カテゴリ記事を表示プログラム
【WordPressでPHPプログラムを学習シリーズ1】用語:PHP変数・関数・定数を、WPの機能を通して覚える
【PHPプログラミング】glob関数を使って、特定ディレクトリ内のファイル一覧取得や、出力を行う方法
【webサイトセキュリティ対策】検索フォームへのSQL判定などがある不正な入力を、WAFで遮断する
【WordPress別サーバー引っ越し】SQLエクスポート/インポート&Redirectionプラグインを使った方法
【WordPress組み込み関数】is_home()とis_front_page()って同じ?→似てますが、厳密には挙動が異なります
侍エンジニア塾ブログにあったPHPコードをシンプルに書いてみる(foreachで配列キーや値取得・continueで空要素スキップ)
PHP・shuffleやarrayを使った、画像ランダム表示方法~メインビジュアルやバナー・テキストにも利用可能
テスト環境(ローカル含む)でPHPサイト開発に使えるツール&xamppでやってみた例(設定や表示ファイルetc)
【WordPressで覚えよう】PHP「->」(オブジェクト演算子/アロー演算子)・「=>」(ダブルアロー演算子)の違い
【超危険】WordPressデータベースリビジョンお掃除