問題描述

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