我已经设置了如下重写规则:
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
阿帕奇不允许‘向上移动目录’。