web-dev-qa-db-ja.com

Wordpressの管理者がログイン試行に失敗する401を返すようにする

現在のところ、Wordpressのデフォルトはログイン試行の失敗または成功のいずれかで200を返しています。すべてのWebアプリケーションフレームワークで使用されている現代の標準は、ログインに失敗すると401(または403)を返すことです。

これにより、サードパーティ製ツール(waf、fail2banなど)が総当たり攻撃の試みを検出し、それをwordpressの外部からブロックすることが可能になります。

私がこの変更を加えることができる場所を見つけることができないか、そのような機能を提供するプラグインがあります。

はい、私はWordpressの内部から「ブルートフォースブロッキング」を提供しようとするプラグインをよく知っています。しかし、それだけで問題があるだけでなく、Wordpressのインストール環境の中から遮断されがちです。そして防御は間違ったレベルに置かれます。境界の防御ではなく、これらすべての要求は実際のワードプレスのインストールに当たります。いいえ、これは私にとって良い選択肢ではありません。

助けてくれてありがとう!

1
alonisser

WordPressは2つの方法で失敗したログインを処理します。

  1. それが不適切な資格であり、ユーザー名とパスワードの両方に値がある場合、このアクションはwp_login_failedによって取得される可能性があります。

  2. 両方または片方のオプションが空の場合、WordPressは認証オブジェクトフィルタの最初のパラメータとしてエラーオブジェクトを生成します。それは開かず、wp_login_failedアクションはこの原因/イベントを捉えます。

コード内のコメントを参照してください。

add_filter( 'authenticate', function( $user, $username, $password ) {
    // forcefully capture login failed to forcefully open wp_login_failed action, 
    // so that this event can be captured
    if ( empty( $username ) || empty( $password ) ) {
        do_action( 'wp_login_failed', $user );
    }
    return $user;
} );

// to handle even you can handle the error like
add_action( 'wp_login_failed', function( $username ) {
    if ( is_wp_error( $username ) ) {
        // you return 401 with wp function, this action takes place before header sent.
        $wp_query->set_401();
        status_header( 401 );
        nocache_headers();

    }
} );

私の答えは、 エラーが 'empty_username'または 'empty_password'WordPressに404を強制する方法

更新:これを行うための超簡単プラグインを書きました WP-401-On-Failed-Login コンテンツが送信される前に、いくつかのwp認証フックとset_header()を使用します。

2
Amit Rahav

あなたのサイトが実行されているサーバーにアクセスできる場合は、modsecurityを使用して(PHP経由ではなく)Webサーバーから401を返すことができます。

これは私がIPをブロックしmodsecurityを通して401を返すことについてしばらく前に書いたチュートリアルです:

https://smyl.es/how-to-block-wp-login-php-brute-logins-with-cpanel-mod-security-and-configserver-firewall/

1
sMyles