サポート » 使い方全般 » 403エラーについて

  • 解決済 smartat

    (@smartat)


    当サイトはログインユーザーしか閲覧できないサイトを運営しています。
    たまに一部ユーザーにおいて403エラーが出る現象についてお聞きしたいです。
    ・サーバー側で特定のIP制限等はしていない
    ・海外IPの制限はしている
    ・403エラーが出たユーザーが、モバイル回線などアクセスできないネットワーク以外を経由してアクセスしてもらうとログインできる
    ・403エラーが出た箇所はwp-login.php(ログイン画面)
    ※ログインページには入れるが、ログインしようとすると403になる

    また、現在当サイトではログイン後、管理画面ではなくトップページにリダイレクトするよう設定しています。
    これは、リダイレクトでトップページに遷移させていますが、裏の処理では管理画面を一度経由しているのでしょうか。

    redirect設定しているphpは以下です
    function login_redirect_page() {
    return home_url();
    }
    add_filter(‘login_redirect’, ‘login_redirect_page’);

    IPアドレス制限にかかっているものと思われますが、管理画面を経由しているのであれば、それを制御できればエラー率は減るのではないかと思った次第です(根本原因にはなっていませんが)

    何か思いつくことがあれば教えていただきたいです。

7件の返信を表示中 - 1 - 7件目 (全7件中)
  • smartatさん、こんにちは。

    最も確実なのは、サーバーのログを確認することです。
    該当のユーザーがアクセスしてきた時間に 403 を出しているエラー箇所を確認し、IP アドレスを確認すれば済む話かと。
    サーバーのログが確認できない状況にあるのであれば、海外 IP 制限を一時的に解除し、同様のエラーが報告されるか確認されてみてもよろしいのではないでしょうか。
    ログイン時には wp-admin に移動、その後リダイレクトされているので、制限に掛かっている可能性はあると思います。

    ご参考になれば。

    トピック投稿者 smartat

    (@smartat)

    @shokun0803さん
    ありがとうございます。
    サーバー側のログですが、403エラー時のIPアドレスまでは取得できていないようです。
    WordpressのdebaglogをTrueに設定しているのですが、ログイン時のエラーが出力されていないような気がします、、
    以下設定です。

    define( ‘WP_DEBUG’, true );
    define( ‘WP_DEBUG_DISPLAY’, false );
    define( ‘WP_DEBUG_LOG’, true );

    smartatさん、こんにちは。

    サーバーのログで確認できないのであれば、ひとつのアイデアではありますが、ログインリダイレクトを実装しているようなので、 return する前にユーザー情報を取得してログファイルに保存してみてはいかがでしょうか。
    もしくはユーザーがログイン処理を行った時点でフックして情報を取得するか…例えば wp_authenticate とか?

    ご参考になれば。

    トピック投稿者 smartat

    (@smartat)

    @shokun0803 さん

    ログを出力するphpは書けたのですが、redirectするときにのメソッドがfunction login_redirect_page()のため、ログイン前のユーザー情報がうまくとれていなかったようでした。
    ログインに成功した時=ページリダイレクトされた時にはログが取れたのですが、失敗=ページredirectがされない時にはとれず。。
    function login_failed()などで試してみましたが、まだうまくいっていない状況です。
    別のことで時間が取れておらず、検証ができてませんでした。また時間あるときにいろいろと試します。

    トピック投稿者 smartat

    (@smartat)

    上記、ログが取れていないと記述しましたが、確認したところ取れていました。
    エラー時のみ情報を取得出来たら一番良いのですが。。現在は、すべてのログが出力されています。。。
    もう少し調査してみます。

    smartatさん、こんにちは。

    ・海外IPの制限はしている

    これが CORESERVER の物であるとしたら、どうやら管理画面に対して動作するように設定しているようですので、ページは表示されるのに管理画面に移行すると 403 が表示される現象にマッチしているように思えます。
    だとするとreturn home_url();実行前に 404 を返してしまっているようにも思えますが、ログを取得している箇所で、PHP でステータスコードを取得してログに書き出してみてはいかがでしょうか。
    これが可能であればステータスコードで分岐もできるはずです。

    http_response_code
    この辺かなぁ。

    もし CORESERVER の海外 IP 拒否だとすると、一瞬でも管理画面を経由するような動作があると 403 を吐き出してしまうかもしれませんね、回避できるのかしら?

    ご参考になれば。

    トピック投稿者 smartat

    (@smartat)

    @shokun0803 さん

    いつもご丁寧にありがとうございます!
    下記コードでとりあえずレスポンスコード、IP情報など取得できるようになりました。
    ※まだエラーは起きていないため、エラー発生時に取得できるかは確認できておりませんが。。
    条件分岐については、今後の運用を鑑みて追記していきたいと考えております。
    本当にいろいろと詳しく教えていただいてありがとうございました。

    function login_redirect_page() {
    /*** 各種情報を取得する ***/
    //ユーザのIPアドレス
    $user_ip = $_SERVER[‘REMOTE_ADDR’];

    //ユーザーが閲覧したページのURL
    $access_url = $_SERVER[‘REQUEST_URI’];

    //アクセス時間
    $access_time = date( ‘Y.n.j H:i’ );

    /*** 取得した情報をファイルに記録する ***/
    //取得した情報を記録するファイルの指定
    $file_name = get_stylesheet_directory() .’/login-info.log’;

    //ファイルに記録する情報の整理(カンマ「,」で区切る)
    $log_contents = http_response_code() . ” , ” . $access_time . ” , ” . $user_ip . ” , ” . $access_url . “\r\n”;
    //ファイルに書き込む
    file_put_contents($file_name, $log_contents, FILE_APPEND);

    return home_url();
    }
    add_filter(‘login_redirect’, ‘login_redirect_page’);

7件の返信を表示中 - 1 - 7件目 (全7件中)
  • このトピックに返信するにはログインが必要です。