Mod_security 排除不完全工作,仍然阻止 CSS 和圖像
我在我的規則中加入了以下任何一項:
SecRule REQUEST_URI "@beginsWith /directory" "phase:1,id:12345,allow" SecRule REQUEST_URI "@beginsWith /directory" "phase:1,id:12345,ctl:ruleEngine=off"
當我瀏覽 /directory/javascript.php?sqlinjection 時,它將允許顯示 /directory 中的 HTML,但不顯示分別位於根目錄 /css/ 和 /images/ 中的 CSS 和圖像。似乎它們被阻止了,因為頁面上有 SQL 注入,但沒有排除這些目錄。
如何將其配置為完全關閉 /directory 中的 mod_security 並顯示所有圖像和 CSS?
在 ModSecurity 中,每個請求都被視為一個獨立的請求,它不知道您正在為之前的請求載入 CSS 和圖像。
它可能知道這一點的唯一方法是Referer HTTP 標頭中的內容。事實上,我懷疑這是導致問題的原因,因為引用頁面的 URL 包含看起來像 SQL 注入的內容,因此它載入的每個資源也會被阻止。
所以你有很多選擇:
- 您可以為 /css 和 /images 編寫類似的規則。請注意,您的兩條規則都做同樣的事情,並且都不是必需的 - 選擇一個或另一個。此外,每個規則都需要有一個獨立的 id,但您在兩個規則中都重複了 12345。
- 您可以為所有請求關閉 ModSecurity。它似乎給你帶來了更多的問題,它正在解決。顯然,這意味著您失去了它提供的安全保護,但如果您最終允許幾乎每個請求都將其關閉,那麼這是一種選擇。
- 您可以編寫一個新規則來繞過基於該引用的 ModSecurity:
#Allow any requests for resources loaded by pages in /directory SecRule REQUEST_HEADERS:Referer "@beginsWith https://www.example.com/directory" "phase:1,id:12347,allow"
4. 您可以覆蓋此欄位受影響的規則(我假設規則 942100 是在此範例中觸發的規則):
#Exclude Referer HTTP Header from being checked by rule id 949110 SecRuleUpdateTargetById 942100 !REQUEST_HEADERS:Referer
選項 4) 將是推薦的方法,因此您只禁用該特定欄位給出誤報的規則。請注意,可能會觸發多個規則,因此您可能需要多個例外。您在之前的問題中也說過規則 949110 正在觸發,但這是最終的檢查規則,因此您需要知道在此之前觸發的規則,並導致 949110 採取行動,並按上述過濾掉它們。
這也是您應該真正防止您的原始 PHP 腳本被阻止的方式,而不是全面關閉整個 /directory 位置的 ModSecurity。
老實說,這些都是配置 ModSecurity 需要做的相當標準的事情,所以建議你閱讀更多。ModSecurity 手冊是學習此恕我直言的最佳方式。