阻止 Apache 解码 PATH_INFO 的 URI 中的字符

阻止 Apache 解码 PATH_INFO 的 URI 中的字符

我想阻止 Apache 从 URI 解码%2B( +) 和%3D( =)。我需要 PATH_INFO 中未解码的那些字符。

我已经通过使用以下方法对%2F( ) 进行了此操作:/

AllowEncodedSlashes NoDecode

但是,我找不到任何可以帮助我对其他编码字符执行相同操作的指令。这可能吗?

答案1

您无法阻止 Apache 解码PATH_INFOApache 服务器变量中的那些 % 编码字符(PHP 稍后将其分配给$_SERVER['PATH_INFO']超全局变量,看似未发生改变)。

该指令是一种特殊情况。这实际上是一种“安全功能”。默认情况下, URL 路径部分中的AllowEncodedSlashes编码斜杠 ( ) 会触发%2F系统生成404 响应。该AllowEncodedSlashes指令允许请求到达应用程序(该NoDecode选项是后来才添加的)。

PATH_INFO如果您想读取PHP 中的%-encoded,那么可以考虑使用不同的$_SERVER变量,例如$_SERVER['REQUEST_URI'],它不是 %-decoded,但这需要一些额外的解析。(请注意,PHP 超全局变量$_SERVER['REQUEST_URI']与同名的 Apache 服务器变量不同,后者是 %-decoded,如果 URL 被重写,则可能完全引用不同的 URL!)

但是,如果您想PATH_INFO使用 Apache(使用 mod_rewrite)读取 % 编码,那么请考虑解析THE_REQUEST服务器变量,该变量包含从客户端发送的整个请求标头。此变量未经过 % 解码。可以将其分配给环境变量甚至 URL 参数,然后由 PHP 以这种方式读取。(请注意,QUERY_STRING服务器变量和相应的$_SERVER['QUERY_STRING']超全局变量未经过 % 解码,但 PHP 会解码数组中的各个参数值$_GET​​。)

相关内容