問題描述

我可以防止在我的 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。