![当请求包含无效字节序列时,如何配置 apache 以响应 400?](https://linux22.com/image/601193/%E5%BD%93%E8%AF%B7%E6%B1%82%E5%8C%85%E5%90%AB%E6%97%A0%E6%95%88%E5%AD%97%E8%8A%82%E5%BA%8F%E5%88%97%E6%97%B6%EF%BC%8C%E5%A6%82%E4%BD%95%E9%85%8D%E7%BD%AE%20apache%20%E4%BB%A5%E5%93%8D%E5%BA%94%20400%EF%BC%9F.png)
在 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 节有关有效字符的详细信息。