
我正在 Symfony 2 網站上工作,並嘗試建立 ModSecurity 規則來匹配特定的瀏覽器 URL。 IE example.com/results
Symfony 2 使用 .htaccess 中的規則在內部重寫對 app.php 的所有請求,因此當我檢查 ModSecurity 規則中的 REQUEST_URI 時,它被設定為 app.php。我嘗試了任何其他看起來相關的伺服器參數,但所有參數要么是 app.php 要么是空白。
有沒有辦法在設定檔中建立基於瀏覽器請求的 URL 的 ModSecurity 規則,而不是基於內部重寫的結果?
像 WordPress 這樣的 CMS 似乎也有同樣的問題:所有內容都被重寫到 index.php,所以我找不到任何方法將 modsec 規則套用到特定路由。 (我想,由於 WP 如此常見,我也許可以通過在那裡搜索相同的問題來找到答案。)
答案1
看起來我可以使用伺服器變量
THE_REQUEST
,按照這個答案:https://stackoverflow.com/a/27968463/160565:
我使用 mod_rewrite 轉儲
THE_REQUEST
到 mod_security 規則上方的環境變數中,然後進行比對。
如前所述,THE_REQUEST
是 mod_rewrite 使用的 Apache 伺服器變量,而不是 mod_security 變數。 mod_security 中直接等效的變數是REQUEST_LINE
,即。請求的第一行。它採用字串的形式,例如:
GET /foo/bar HTTP/1.1
THE_REQUEST
當 URL 被重寫時 (mod_rewrite) 變數不會改變,而REQUEST_URI
(mod_rewrite) 會改變。
然而,令我有點驚訝的是REQUEST_URI
(mod_security) 變數返回重寫的 URL(也許這與指令的順序或使用 mod_security 有關)嵌入式?REQUEST_URI
就在 mod_security 規則之上...
mod_security 規則可能應該位於檔案的頂部(如果還沒有的話),位於任何 mod_rewrite 指令之前。 (儘管我不確定順序是否真的重要。)
請注意,REQUEST_URI
(mod_security) 變數與 (mod_rewrite) 變數不同REQUEST_URI
,儘管名稱相同。值得注意的是,REQUEST_URI
(mod_security) 包含查詢字串,而REQUEST_URI
(mod_rewrite) 則不包含。
參考:
更新:
...
REQUEST_URI
(mod_security) 變數傳回重寫的 URL
您可能在請求中太晚運行 mod_security 規則,即。在錯誤的phase
?來處理要求的您應該比較的網址REQUEST_URI
在以下任一個中進行比較的 URL階段1 或 2(請求)。後面的階段(即 3 - 5)將根據回應進行處理,這可以解釋為什麼您看到的是重寫的 URL,而不是請求的 URL。
這phase
在行動論據或SetDefaultAction
指令。例如:
SecDefaultAction "log,pass,phase:2,id:4"
SecRule REQUEST_URI "attack" "phase:1,id:52,t:none,t:urlDecode,t:lowercase,t:normalizePath"
這五個階段是:
- 請求標頭 (REQUEST_HEADERS)
- 請求正文 (REQUEST_BODY)
- 響應標頭 (RESPONSE_HEADERS)
- 回應正文 (RESPONSE_BODY)
- 日誌記錄(LOGGING)
從 ModSecurity 版本 v2.7 開始,某些階段號有別名:
2 - 請求
4 - 回應
5 - 記錄例子:
SecRule REQUEST_HEADERS:User-Agent "Test" "phase:request,log,deny,id:127"
參考:
答案2
看起來我可以使用伺服器變數 THE_REQUEST,根據這個答案:https://stackoverflow.com/a/27968463/160565