如何防止 apache 在 URL 路径中使用单斜杠减少双斜杠?
Posted
技术标签:
【中文标题】如何防止 apache 在 URL 路径中使用单斜杠减少双斜杠?【英文标题】:How to prevent apache from reducing double slashes with single slash in a URL path? 【发布时间】:2012-09-06 22:34:21 【问题描述】:Apache 有一种非常讨厌的倾向,即用单斜杠替换 URL 中的双斜杠。
例子:
请求网址:http://example.com/myscript.php/foo//bar
当我看到
$_SERVER['PATH_INFO'];
var,路径信息会显示为:
foo/bar
而不是
foo//bar
有人知道解决这个问题的方法吗?我相信这在 apache 的功能中根深蒂固……我不知道是否有某种 apache 标志可以调整以禁用此行为。
【问题讨论】:
为什么要保留双斜线? ...而且我很确定是浏览器修复了它,因为它的 url 无效... @Erik 不是浏览器。 URL 不是无效的。此实例中的双斜杠是 附加路径信息 (PATH_INFO) 的一部分 - 跟踪现有(有效)URL 的 URL 部分。 【参考方案1】:
http://example.com/myscript.php/foo//bar
/foo//bar
是跟随实际文件名的附加路径信息。虽然 Apache 确实减少了 PATH_INFO 服务器变量(传递给相应的 PHP 超全局变量)中的多个斜杠,但 $_SERVER['PHP_SELF'] 变量中仍然可以使用原始 URL(带有多个斜杠)。
因此,您可以执行以下操作,而不是通过 PATH_INFO
变量访问路径信息:
$pathInfo = str_replace($_SERVER['SCRIPT_NAME'],'',$_SERVER['PHP_SELF']);
这只是从 PHP_SELF 中删除 SCRIPT_NAME,留下 path-info(如果有的话)。您可以使用 REQUEST_URI 代替 PHP_SELF,但这包括查询字符串,因此您需要检查这一点。
所以,给定上述请求,其中SCRIPT_NAME
是“/myscript.php”,PHP_SELF
是“/myscript.php/foo//bar”,那么生成的$pathInfo
是“/foo//吧”。
【讨论】:
【参考方案2】:它是解析 URI 的 RFC 标准的一部分,因此您无法更改它。
甚至您的浏览器可能会在将请求发送到远程服务器之前规范化 URI。
【讨论】:
呃,我担心答案会是这样的......哦,好吧。烦人。 可以转义字符 / 并将其替换为 ASCII 值,参见 urlencode()【参考方案3】:nginx 有一个 merge_slashes 指令,允许合并斜线以匹配位置,默认为关闭,这意味着默认情况下不合并。如果 RFC 中指定了合并行为,那么 nginx 肯定不会遵循。
【讨论】:
以上是关于如何防止 apache 在 URL 路径中使用单斜杠减少双斜杠?的主要内容,如果未能解决你的问题,请参考以下文章
当 URL 路径中出现双斜杠时,如何使用 Elastic Beanstalk (Apache+Tomcat) 解决 HTTP 404 错误,例如https://uat.myserver//rest/s
Lab: File path traversal, traversal sequences stripped with superfluous URL-decode 文件路径遍历,URL解码来防止过滤