首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >NGINX将%2f取消转义为正斜杠。我怎么才能阻止它呢?

NGINX将%2f取消转义为正斜杠。我怎么才能阻止它呢?
EN

Stack Overflow用户
提问于 2011-11-25 10:18:15
回答 4查看 10.6K关注 0票数 19

假设我想要在URL中对文章标题进行编码,该URL包含一个斜杠。如果我对得到的文章标题进行URL编码:

代码语言:javascript
复制
http://example.com/articles/foo%2fbar/view/

NGINX将其传递给我的FastCGI应用程序:

代码语言:javascript
复制
http://example.com/articles/foo/bar/view/

这相当于毁了这个想法。

我注意到,如果NGINX正在提供一个文件,比如/path/to/page.html,那么可以通过以下两个URL之一到达:

代码语言:javascript
复制
http://example.com/path/to/page.html
http://example.com/path/to%2fpage.html

然而,(例如) Apache并非如此。

有什么方法可以解决这个问题吗?

我试过docs和Google,但都没有成功。

谢谢。

更新

nginx配置:

代码语言:javascript
复制
worker_processes  1;
pid ./nginx.pid;
events {
    worker_connections  1024;
}
http {
    server_tokens off;
    server {
        listen 80;
        server_name localhost;
        location /mysite/{
            fastcgi_pass   unix: ./mysite.fcgi.socket;

            fastcgi_param SERVER_NAME $server_name;
            fastcgi_param SERVER_PORT $server_port;
            fastcgi_param SERVER_PROTOCOL $server_protocol;
            fastcgi_param SCRIPT_NAME "/mysite/";
            fastcgi_param PATH_INFO $fastcgi_path_info;
            fastcgi_param REQUEST_METHOD $request_method;
            fastcgi_param QUERY_STRING $query_string;
            fastcgi_param CONTENT_TYPE $content_type;
            fastcgi_param CONTENT_LENGTH $content_length;
            fastcgi_pass_header Authorization;
            fastcgi_intercept_errors off;
        }
    }

}
EN

回答 4

Stack Overflow用户

发布于 2011-11-28 01:44:31

尝试将"%“转义为"%25”

代码语言:javascript
复制
http://example.com/articles/foo%252fbar/view/
票数 2
EN

Stack Overflow用户

发布于 2018-12-18 05:33:50

如果你是proxy_pass用户,Nginx pass_proxy subdirectory without url decoding上提供了关于这个问题的更多细节,它有一个完整的解决方案。

对于fastcgi_pass,,这可能是由于nginx中的默认conf/fastcgi.conf造成的,其中DOCUMENT_URI变量被设置为http://nginx.org/r/$document_uri,这等同于http://nginx.org/r/$uri,反过来,它是http://nginx.org/r/$request_uri的规范化(解码和未转义)、无查询和可能重写的版本(反过来,可以通过REQUEST_URI访问):

fastcgi_param REQUEST_URI $request_uri;fastcgi_param DOCUMENT_URI $document_uri;

然而,在您的示例中,您似乎根本没有指定DOCUMENT_URI,因为如果在当前级别使用http://nginx.org/r/fastcgi_param,则不会从上一级别继承,因此,解码后的路径可能来自您的http://nginx.org/r/$fastcgi_path_info,而您在提供的配置中省略了http://nginx.org/r/fastcgi_split_path_info,因此,原始问题可能看起来不一致,因为所提供的请求和示例配置之间的确切路径也不匹配。

无论如何,fastcgi的最佳修复将取决于应用程序,并且可能是以下之一:

  • 不依赖于未被nginx正确解码和清理的路径。这可能是最好的安全修复,因为你基本上是在要求nginx不要清理像/../这样的东西(包括所有转义的变体),这当然是为了保护你免受backend.
  • Redesign中的一整类漏洞的影响整个接口使用QUERY_STRING中的查询参数来确保路径不会混淆或解码prematurely.
  • Use REQUEST_URI以在没有任何规范化或解码的情况下获得原始请求URI。
  • 密切关注使用$uri$document_uri的所有实例,可能还有$fastcgi_path_info
  • 使用linked answer中概述的重写技巧将未解码的$request_uri放回$uri中。请注意,如果走此路线,您可能还必须手动剥离查询字符串。

顺便说一句,你首先要做的就是玩火,因为如果你没有完全理解你在做什么,如果有一天有人决定利用你依赖于这些编码路径绕过对nginx的正确处理和审查,那么很容易引入安全漏洞。

事实是,你想要做的事情在Apache中按原样工作更多的是一个bug,而不是一个功能-这在nginx中的工作方式是不同的,因为它的设计和为了防止整个类别的安全漏洞。

票数 2
EN

Stack Overflow用户

发布于 2015-10-20 21:06:49

如果您使用URL查询参数,则不会有任何问题。当您可以控制您的服务器路由时,您可以执行以下操作:

http://example.com/articles/view/?path=foo%2fbar

并且nginx不会接触%2f

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8264239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档