htaccess 規則以防止對 WordPress index.php?pubkey= 的惡意發布請求
我一直在查看由一個名為 Bad Behavior 的 WordPress 外掛創建的日誌,其中有許多來自不同 IP 地址的條目在一天中以不同的時間間隔請求以下 URL:
POST www.example.com/index.php?pubkey=b13bdb8297326599cf86aj25274e6a0c&bvTime=1549500166&bvVersion=0.1&bvMethod=getdata&sha1=true&sig=53fb643e40685ed89aa6754483b0a0d06bf1e63d0
URL 中保持不變
/index.php?pubkey=
的部分與日誌中其他條目的其餘部分不同。如果可能的話,我想做的是通過
.htaccess
根目錄中的 阻止這些發布請求。在研究時我在這裡找到了這個答案:Restrict Access To index.php - Apache
但由於我並不真正了解如何在
.htaccess
文件中正確建構指令,因此我不想在其中添加可能會阻止合法流量或導致其他問題的內容。同樣在搜尋時,我在https://perishablepress.com/protect-post-requests/上找到了這條資訊,但他們警告您,如果網站不是靜態的或使用表單,則使用以下規則可能會出現問題,特別是網站可以。
#deny all POST requests <IfModule mod_rewrite.c> RewriteCond %{REQUEST_METHOD} POST RewriteRule .* - [F,L] </IfModule>
話雖如此,我希望這裡添加了足夠的資訊,可以幫助某人幫助我找到這個特定問題的答案。
該解決方案確實與您連結到的問題非常相似。
但是,我要問的一個問題是,您是否需要專門針對 POST 請求?為什麼不啟動任何請求(GET 或 POST)
/index.php?pubkey=
?或者這在 WordPress 中是否有其他含義?在這種情況下,您可以在
.htaccess
文件頂部執行以下操作:RewriteCond %{QUERY_STRING} ^pubkey= RewriteRule ^index\.php$ - [F]
不需要
<IfModule>
包裝器。無需重複該RewriteEngine
指令,因為這無疑是在文件的後面設置的。要專門針對 POST 請求,您可以添加另一個條件,就像您在範例中所做的那樣:
RewriteCond %{REQUEST_METHOD} POST RewriteCond %{QUERY_STRING} ^pubkey= RewriteRule ^index\.php$ - [F]
**更新:**它沒有像我預期的那樣工作,因為我可以通過訪問來載入頁面
www.example.com/index.php?pubkey=
如果上述指令在
.htaccess
文件中的錯誤位置並且與其他指令衝突,則可能會發生這種情況。它需要位於.htaccess
文件的最頂部,在任何現有的 mod_rewrite 指令之前。經過一些試驗和錯誤,這完全阻止了我,它可以工作,但我不明白為什麼,你能解釋一下你給我的和這個之間的區別嗎?
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{QUERY_STRING} (pubkey=.*) [NC] RewriteRule (.*) - [F,L] </IfModule>
這要籠統得多,並且不僅會阻止您問題中所述的 URL(可能太多)。這些指令阻止查詢字元串中任何位置包含(不區分大小寫)的任何URL路徑*。*因此,它將阻止以下 URL(除了上述 URL):
pubkey=
example.com/foo/bar?pubkey=xyz
example.com/foo/bar/baz?abc=1&xyz=2&pubkey=
example.com/foo/bar/baz?def=2&xyz=3&PuBkEy=xyz
這些指令可以簡化:
RewriteCond %{QUERY_STRING} pubkey= [NC] RewriteRule .* - [F]
無需擷取
RewriteRule
模式或CondPattern。_ 正則表達式pubkey=
與pubkey=.*
. 使用L
標誌時不需要F
標誌。並且如上所述,無需重複RewriteEngine
指令或使用<IfModule>
包裝器。