【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別サーバー引っ越し】SQLエクスポート/インポート&Redirectionプラグインを使った方法
【WordPress組み込み関数】is_home()とis_front_page()って同じ?→似てますが、厳密には挙動が異なります
【PHP etc.プログラム学習サイトコードコピペ】全角引用符・バッククオートが入ってて動かない件に注意
【WordPress】記事文字数のカウント方法(コア機能・プラグイン)チェックと、フロントへの出力について
【画像つきでわかりやすい】WordPressで使われるデータは、MySQLデータベースに、どのように格納されているの?
【PHP学習】var_dumpで出力するのと、echoで出力するのは、挙動がどのように違うの?
WPデータベースの余計なデータには何がある?事例と対処方法・あるとイヤなケース
WordPress一覧表示で、特定のカテゴリ/投稿を表示しないようにするには?→category_not_in・post_not_inで
【WordPressでPHPプログラムを学習シリーズ1】用語:PHP変数・関数・定数を、WPの機能を通して覚える
PHP・mb_substr関数を使って、タイトル文字数を揃える(WPレイアウト調整)
PHP・shuffleやarrayを使った、画像ランダム表示方法~メインビジュアルやバナー・テキストにも利用可能
【WPユーザー名バレ対策】ユーザー名表示からPHP・preg_matchでリダイレクト(wp-json/wp/v2/usersなど)