wordpressでのスマホ対応webサイト制作・wpプラグイン・PHPプログラム・SNS活用・ 動画・bgmやテーマ曲アレンジまで考えるコラム!

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

      2020/09/13

こんにちは、管理人@SS_mshpです。


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

*アトリエSS・web制作サービスページに移動します。webリニューアル・ロゴ・記事・wordpress化などでお力添えできます。

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

  関連記事

【WordPress組み込み関数】is_home()とis_front_page()って同じ?→似てますが、厳密には挙動が異なります

今回は、WordPressで条件分岐するときによく使われる組み込 ...

【PHP etc.プログラム学習サイトコードコピペ】全角引用符・バッククオートが入ってて動かない件に注意

今回は、管理人が学習サイトなどでコードを調べていて、4回くらい遭 ...

WordPressの記事IDで判定して転送~PHP・headerとget_the_IDで対応、the_IDとの挙動の違いも

今回は、前回の『別ディレクトリにWP記事を出す』の続きで、新しい ...

【WP記事取得クエリ・プラグイン無し】お知らせなどに使える、ショートコードで特定カテゴリ記事を表示プログラム

今回は、最近何件か対応した、お客さん提供用の自社開発WPテーマに ...

PHP・mb_substr関数を使って、タイトル文字数を揃える(WPレイアウト調整)

今回はPHP関数を使って、表示の調整をしてみたいと思います タイ ...

【ユーザーデータ取得】WordPress定義済み関数の『get_userdata()』『wp_get_current_user()』ってどのように違うの?

今回は、WPシステムのwebサイト制作などでちょくちょくお目にか ...

【画像つきでわかりやすい】WordPressで使われるデータは、MySQLデータベースに、どのように格納されているの?

今回は、学習コンテンツです(WordPress&MySQLデータ ...