问题描述

我可以防止在我的 wordpress 网站上枚举用户名吗?我可以使用 WPScan 工具查看用户。

最佳解决方案

我在.htaccess 中使用的一个简单的解决方案:

RewriteCond %{REQUEST_URI} !^/wp-admin [NC]
RewriteCond %{QUERY_STRING} author=d
RewriteRule ^ - [L,R=403]

它类似于 @ jptsetme 的答案,但即使查询字符串是/?dummy&author=5 也可以工作,RewriteRule 的搜索模式非常快:您通常会在正则表达式中看到 ([0-9]*)。但是当您不使用捕获的表达式时,无需浪费内存进行捕获,第一个字符的匹配就足够了,因为您不想接受 author=1b

更新 20.04.2017

我看到更多的”broken” 请求,甚至太愚蠢的人来运行一个简单的扫描。请求的网址如下所示:

/?author={num:2}

所以你可以将上面的规则扩展到:

RewriteCond %{REQUEST_URI} !^/wp-admin [NC]
RewriteCond %{QUERY_STRING} ^author=d+ [NC,OR]
RewriteCond %{QUERY_STRING} ^author={num 
RewriteRule ^ - [L,R=403]

次佳解决方案

你不行

WPScan 工具是一种自动化实用程序,可利用 WordPress 的友好 URL 来确定用户名。 It will loop through 是作者的前 10 个可能的 ID,并检查 HTTP 响应中的 Location 标头以找到用户名。

http://mysite.url 为例…

WPScan 将检查 http://mysite.url/?author=1 。如果您的网站使用漂亮的永久链接,它将返回一个 301 重定向与 http://mysite.url/author/usernameLocation 标头。如果您的网站没有使用漂亮的永久链接,则会返回 200(OK) 状态,因此 WPScan 可以检查字符串 「用户名」,并提取用户名。

你可以做什么

首先,只是因为有人可以猜到你的用户名,并不意味着你的网站是不安全的。真的没有办法阻止某人以这种方式解析您的网站。

但是…

如果你真的关心这个,我会建议做两件事情:

  1. 关闭漂亮的永久链接。这将强制 WPScan 和类似的工具来解析用户名的网站内容,而不是依赖该 URL 。
  2. 强制用户设置不同的昵称。在网址中没有用户名的情况下,扫描工具会在 Feed /帖子内容中搜索 「用户名的帖子」 。如果您没有将用户名放在那里,那么它们就不能被篡改。

另一个选择是改变你的作者永久重写。有几种方法可以做到这一点,你可以使用 find a few on this site as well

第三种解决方案

您可以使用.htaccess 重写规则来防止这种披露,但是您还应该确保使用昵称,以避免在可解析内容中披露用户名,如 EAMann 所述。

以下博客描述了如何做,但在重写规则中有错字:http://www.question-defense.com/2012/03/20/block-wordpress-user-enumeration-secure-wordpress-against-hacking

正确的规则也应该从重写的 URL 中删除查询字符串,否则您仍然会公开用户名。它应该是这样的:

# Stop wordpress username enumeration vulnerability
RewriteCond %{REQUEST_URI}  ^/$
RewriteCond %{QUERY_STRING} ^/?author=([0-9]*)
RewriteRule ^(.*)$ http://yoursite.com/somepage/? [L,R=301]

为我们工作很好

第四种方案

没有彻底测试这个,但我认为最好删除底层资源,而不是试图在 Web 服务器级别上围绕它构建墙壁。所以在 WP 术语中,将阻止它处理 author-related 查询变量。

if ( ! is_admin() ) {
    add_filter(
        'query_vars',
        function ( $public_query_vars ) {

            foreach ( array( 'author', 'author_name' ) as $var ) {
                $key = array_search( $var, $public_query_vars );
                if ( false !== $key ) {
                    unset( $public_query_vars[$key] );
                }
            }

            return $public_query_vars;
        }
    );
}

PS 注意到这将完全杀死作者档案,这可能或可能不适合偏执狂级别:)

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。