mod_wsgi
我使用默认安装来设置 Apache ,并安装了一个非常简单的测试应用程序test.wsgi
,如下所示:
def application(environ, start_response):
status = '200 OK'
output = 'Path: %s' % environ['PATH_INFO']
response_headers = [('Content-type', 'text/plain'),
('Content-Length', str(len(output)))]
start_response(status, response_headers)
return [output]
Apache 本身基本上是这样配置的:
WSGIScriptAlias / /home/user/wsgi_test/test.wsgi
现在,如果我访问该服务器上的 URL,我会得到以下输出:
GET /test/../test/./test
=>Path: /test/test
GET /test/%2E%2E/abc
=>Path: /abc
GET /test%2fabc
=>404 Not found
(我猜是因为AllowEncodedSlashes off
)
因此在我看来,Apache 在将这些 URL 传递给应用程序之前会解析/预处理它们,这很好,因为它可以防止大量本地文件包含和目录遍历攻击,其中文件路径不是查询字符串的一部分。
我们可以依赖这种行为吗?或者是否存在一些卑鄙的方法可以欺骗 Apache 实际将 URL 传递/test/foo/../bar
给应用程序?如果可能的话,这会是 Apache 错误吗?
答案1
安全指南“纵深防御”建议您应配置 Apache 来预处理路径,但您自己也应该防范危险路径。
由于您可能对有效路径的样子有更多了解,所以您应该能够提出更严格的测试,而且比 Apache 通常可以做的任何事情都更容易正确完成。