У меня есть такое правило перезаписи:
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?
Включая ..
в URL-адресе не работает ни на уровне HTTP-запроса, ни на уровне браузера. Браузеры просто разрешают относительные пути, отправляя запрос на соответствующий файл (ограничивая его корнем сервера). Итак, введите это в адресную строку:
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
Apache не позволяет «перемещаться вверх по каталогу».