Url

當請求包含無效的字節序列時,如何配置 apache 以響應 400?

  • November 23, 2012

在 Web 應用程序上,有人發出包含無效字節的無效 HTTP 請求。

根據RFC 3986,第 2 節的 HTTP 請求行中只允許使用 ASCII 字元。但是我收到的請求包含字節序列(以十六進製表示)\0xC3\0xA6,它是 ’ æ’ 的 UTF-8 字節序列(當然應該被百分比編碼為%C3%A6)。在 apache 日誌中,它們顯示為\xc3\xa6. 儘管如此,這是一個無效的 HTTP 請求,所以我想在這種情況下配置 apache 以響應錯誤 400 Bad Request,而不是將請求委託給我的 Rails 應用程序。我怎樣才能做到這一點?

順便說一句:我的 Web 應用程序是 Ruby on Rails(由 Phusion Passenger mod_rails 3.0.13 提供),但我認為這與問題無關,因為我對配置 apache 感興趣,以便這些請求永遠不會到達我的應用程序。

我使用 mod_rewrite 成功配置了 apache 以響應 400 Bad request,其中包含帶有無效字元的 URL。

本教程的啟發,我將此片段添加到我的 apache 配置文件中:

# unreserved [a-zA-Z0-9\-\.\_\~]
# reserved gen-delims [\:\/\?\#\[\]\@]
# reserved sub-delims [\!\$\&\'\(\)\*\+\,\;\=]
RewriteCond %{THE_REQUEST} !^[A-Z]{3,9}\ [a-zA-Z0-9\%\-\.\_\~\:\/\?\#\[\]\@\!\$\&\'\(\)\*\+\,\;\=]+(\ .+)?$
RewriteRule ^.*$  -  [redirect=400,last]

有關有效字元的詳細資訊,請參閱RFC3986,第 2.2 和 2.3 節。

引用自:https://serverfault.com/questions/451521