这是一个不安全的 Apache 重写规则吗?

这是一个不安全的 Apache 重写规则吗?

我已经设置了如下重写规则:

RewriteCond %{DOCUMENT_ROOT}/cache/%{REQUEST_URI} -f
RewriteRule ^(.*)$ cache/$1 [QSA,PT,L]

这条规则的简要说明:它检查请求的文件是否存在于缓存目录中。如果存在,则为缓存目录提供服务。

例如请求http://somehost.tld/about.html 将从http://somehost.tld/cache/about.html(如果此文件存在)。

我担心的是 RewriteRule 是否不安全。有人可能会请求这样的 URL(其中包含两个句点)来向上移动目录吗:

http://somehost.tld/../../private_file.txt

那么是否会导致 private_file.txt 从我的 apache 公共文件夹上方的目录提供?

答案1

在 HTTP 请求级别或浏览器级别,将..URL 包含在内都不起作用。浏览器只会解析相对路径,发送对相应文件的请求(将其限制在服务器根目录)。因此,在地址栏中输入以下内容:

http://somehost.tld/../../private_file.txt

将导致 HTTP 请求:

http://somehost.tld/private_file.txt

换句话说,有人必须手动编写 HTTP 请求才能../..到达 Apache。然后返回HTTP 400 Bad Request。来自我的本地服务器的示例(没有重写规则):

ritsuko:~ spyder$ curl -v http://localhost/../randomfile
* About to connect() to localhost port 80 (#0)
*   Trying ::1... connected
* Connected to localhost (::1) port 80 (#0)
> GET /../randomfile HTTP/1.1
> User-Agent: curl/7.19.4 (universal-apple-darwin10.0) libcurl/7.19.4 OpenSSL/0.9.8l zlib/1.2.3
> Host: localhost
> Accept: */*
> 
< HTTP/1.1 400 Bad Request
< Date: Wed, 17 Feb 2010 13:18:40 GMT
< Server: Apache/2.2.13 (Unix) mod_ssl/2.2.13 OpenSSL/0.9.8l DAV/2
< Content-Length: 226
< Connection: close
< Content-Type: text/html; charset=iso-8859-1
< 
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
</p>
</body></html>
* Closing connection #0

答案2

阿帕奇不允许‘向上移动目录’。

相关内容