使WordPress管理员登录尝试失败返回401

时间:2016-11-22 作者:alonisser

目前,wordpress默认值在登录尝试失败或成功时返回200。所有web应用程序框架使用的现代标准是在登录尝试失败时返回401(或403)。

这允许第三方工具(如waf、fail2ban等)检测暴力强迫尝试并从wordpress外部阻止它。

我找不到可以在哪里进行更改,或者是否有提供此类功能的插件。

是的,我很清楚有插件试图从Wordpress内部提供“暴力阻止”。但除了自身存在问题外,它们还容易被Wordpress安装内部关闭。而防守是在wrong 数量所有这些请求都没有成为周界防御,而是命中了wordpress的实际安装。所以不,这对我来说不是一个好的选择。

谢谢你的帮助!

2 个回复
SO网友:Amit Rahav

WordPress以两种方式处理登录失败:

如果凭证不正确,并且用户名和密码都有值,则wp\\u login\\u failed可以捕获此操作

如果两个或其中一个选项都为空,则WordPress将生成错误对象作为身份验证过滤器中的第一个参数;它不会打开,wp\\u login\\u failed action捕获了我们在此处所做工作的原因/事件,

参见代码中的注释:

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();

    }
} );
我的答案是:Redirect user using the 'wp_login_failed' action hook if the error is 'empty_username' or 'empty_password'How to force a 404 on WordPress

update: 我写了一个超级简单的插件来实现这一点WP-401-On-Failed-Login. 它使用一些wp auth挂钩,并在发送内容之前设置\\u header()。

SO网友:sMyles

如果您有权访问正在运行站点的服务器,那么可以使用modsecurity从web服务器返回401(而不是通过PHP)。

这是我不久前写的一篇关于阻止IP并通过modsecurity返回401的教程:

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

相关推荐

Content-Security-Policy标头存在并显示正确的设置,但仍收到拒绝的连接

所以我把一个插件放在一起,它允许我用一个在线服务连接多个客户端站点。我可以让服务供应商代码段加载,但一旦你与它交互,事情就会变得棘手,它拒绝加载(我猜)iframe。。。它的文档记录很差。Refused to load https://www.service-domain.com/ because it does not appear in the frame-ancestors directive of the Content Security Policy.这是我收到的控制台日志错误。因此,我跳回插件