質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.34%

投稿者アーカイブにクエリパラメータでアクセスしたときに発生するリダイレクト

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 2,035

flat

score 607

http://example.com/?author=1のようなURLにアクセスしたときにhttp://example.com/author/adminのようなユーザー名を含むURLにリダイレクトしてしまうので、これをユーザーIDを参照する形にしようと思いリライトルールを書き換えて管理画面から更新してみたのですが、依然としてユーザー名へのリダイレクトが発生します。

function edit_wp_rewrite() {
  global $wp_rewrite;

  $wp_rewrite -> add_rewrite_tag( '%author%', '([0-9]+)', 'author=' );
}
add_action( 'init', 'edit_wp_rewrite', 0 );


また、投稿者アーカイブのリライトルールを削除して投稿者アーカイブを無くしてもこのリダイレクトは発生します。

// 投稿者アーカイブのリライトルールを削除
add_filter( 'author_rewrite_rules', '__return_empty_array' );


このリダイレクトの処理は一体どこで行われているのでしょうか…?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

404にはなりますが、確かにユーザー名が出ますね。
未検証ですが、下記のような解決方法を見つけました。(明日試してみます)

add_filter( 'author_rewrite_rules', '__return_empty_array' );
function disable_author_archive() {
    if( $_GET[ 'author' ] || preg_match( '#/author/.+#', $_SERVER[ 'REQUEST_URI' ] ) ){
        wp_redirect( home_url( '/404.php' ) );
        exit;
    }
}
add_action( 'init', 'disable_author_archive' );

【投稿者アーカイブを無効化してWordPressのユーザ名を隠す方法 | ウェブコンテンツウェブコンテンツ】
http://www.webcontent.jp/no-author-archive/


追記:

投稿者アーカイブが利用できなくなるのは避けたいので、
author/admin ではなく author/1 にリダイレクトする

これでは?

function only_my_author_archive() {
    if( $_GET[ 'author' ] && $_GET[ 'author' ] > 0 ){
        wp_redirect( home_url( '/author/'.intval( $_GET[ 'author' ] ) ) );
        exit;
    }
}
add_action( 'init', 'only_my_author_archive' );

追記2:

カノニカル時に利用されているであろう '%author%' を使っている(記述がある)のが get_author_posts_url get_permalink の2つのみで、「Edit_Author_Slug」が使用しているのが get_author_posts_url 内の author_link フックなので、ひとまずこれでいけそう。

add_filter( 'author_rewrite_rules', '__return_empty_array' );
function my_author_link( $link = '', $user_id = 0 ) {
    if ( $user_id > 0 ) {
        $link = home_url( user_trailingslashit( '/author/'.$user_id ) );
    }
    // Return the link.
    return $link;
}
add_filter( 'author_link', 'my_author_link', 20, 2 );

(参考)

【get_author_posts_url() | Function | WordPress Developer Resources】
https://developer.wordpress.org/reference/functions/get_author_posts_url/

【get_permalink() | Function | WordPress Developer Resources】
https://developer.wordpress.org/reference/functions/get_permalink/

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/21 02:02

    re: flat さん
    ああ、なるほど。get_userdata()オブジェクト内のIDプロパティということですね?
    (※おっしゃる通り、自分が言っていたIDというのはログインに使用するID=user_loginプロパティの値のことです。こちらの認識がちょっとズレていましたね…申し訳ございませんでした。。)

    完全に話の腰を折った感じでしたね…大変失礼いたしました。。

    ---ここからは参考程度に---
    確かに、author=1の権限グループは後から変更ができないので、存在する=管理者
    という公式は成り立ちますが、重要なのはそこからどんなデータが返されるか?だと思います。
    実際、IDプロパティの値が分かったところでその情報だけでは攻撃には結びつきません。
    SQLインジェクションできてしまう箇所があるなら論外ですが、
    閲覧者が自由に入力可能な箇所から「自前でデータベース接続する+受け取った値で動的にクエリを発行(静的プレースホルダーを使っていない等)※注1」という処理を追加していない限り、WordPress側でちゃんと対応されているのでSQLインジェクションの危険性はほとんど無いと言えるかなと。
    (※注1:動的に組み立てるのが絶対的に悪い、とは言えませんが)

    なので、クエリの結果から返る値をしっかりと処理してさえいれば、author=1の存在有無が外部に漏れることの問題はさほど無いかな、と考えています。

    思い切り横道に逸れてしまいましたね…申し訳ないです。。

    キャンセル

  • 2016/04/21 19:21

    Re: manabufukai
    > 申し訳ないです。
    いえいえ、とても有益なお話でした。
    どのようなデータかというのはしっかりと認識しなければいけませんね。
    初心を忘れないことと同じように、私もその意識は常に持つように改めて心掛けていきます。

    あとは余談というか雑談みたいになってしまいますが、manabufukaiさんのコメントに触発されて色々とユーザー情報の秘匿に関する課題が浮かんできました。

    - comment_class()
    ログインユーザーのコメントのクラスにユーザー名が表示される(フィルターフックで簡単に対処できる)
    *対処済み

    - ユーザーの新規登録
    10文字未満のユーザー名(user_login)による登録は無効にする
    新規登録時の項目にニックネームも追加して、新規登録時から表示名をニックネームにする処理を追加(これは「SX User Name Security」というプラグインでおそらく可能)
    「Gianism」などのプラグインでソーシャルアカウントによる登録ができるようにする

    - 著者への連絡先情報としてメールアドレスを表示させたい場合は、登録時のメールアドレスとは別のメールアドレスを表示させるように諸々の処理を追加(それほど難しくない)

    - ログインIDをログインユーザー名かメールアドレスのどちらかひとつにする
    メールアカウントが乗っ取られた場合やリスト型アカウントハッキングを考慮すると、ログイン情報をユーザー名のみにした上で2段階認証などを導入するのが無難?

    このあたりでしょうか。
    プラグインに頼らずに全部に対応しようとすると物凄く大変そうなので、プラグインで対応できるところはプラグインを利用した方が良いですね。
    対応済みのcomment_class()以外は、私の場合にはすぐに対応しなければいけないようなものは無いのであくまでも思い浮かんだだけなのですが、もしかしたらこれらの対応が必要になるときが来るかもしれません。

    何だか話を広げすぎた気がしますが、またこのような機会がありましたら、その時にはぜひ回答を頂けると嬉しく思います。

    キャンセル

  • 2016/04/22 01:14 編集

    To: kei344
    すみません、解決したと思っていたというか解決自体はしているのですが、ちょっと疑問に思った事があったので質問に追記します。

    追記
    ごめんなさい、変数名を間違えていたというケアレスミスによる私の勘違いでした…。
    回答を編集する前に気付いて良かった…。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る