当请求包含无效字节序列时,如何配置 apache 以响应 400?

当请求包含无效字节序列时,如何配置 apache 以响应 400?

在 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,以便这些请求永远不会到达我的应用程序。

答案1

我成功使用 mod_rewrite 配置 apache 来响应包含无效字符的 URL 的 400 Bad request。

灵感来自本教程我将此代码片段添加到我的 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 节有关有效字符的详细信息。

相关内容