Запретить доступ к папкам .svn на Apache - PullRequest
56 голосов
/ 29 декабря 2008

У нас есть приложение rails в subversion, которое мы разворачиваем с помощью Capistrano, но заметили, что мы можем получить доступ к файлам в /.svn, что представляет проблему безопасности.

Я хотел знать, как лучше всего это сделать. Несколько идей:

  • Глобальная конфигурация Apache для запрета доступа
  • Добавление файлов .htaccess в общую папку и все подпапки
  • Задача Cap, которая меняет разрешения

Мне не очень нравится идея удаления папок или использования svn export, так как я хотел бы сохранить 'svn info'.

Ответы [ 13 ]

62 голосов
/ 29 декабря 2008

Лучший вариант - использовать конфигурацию Apache.

Использование htaccess или глобальной конфигурации зависит главным образом от того, управляете ли вы своим сервером.

Если вы это сделаете, вы можете использовать что-то вроде

<DirectoryMatch .*\.svn/.*>
    Deny From All
</DirectoryMatch>

Если вы этого не сделаете, вы можете сделать нечто подобное в файлах .htaccess с помощью FilesMatch

43 голосов
/ 29 декабря 2008

Еще один способ защитить файлы .svn заключается в использовании перенаправления в конфигурации Apache:

RedirectMatch 404 /\\.svn(/|$)

Таким образом, вместо получения 403 запрещенных (и предоставления подсказок для атакующих) вы получаете 404, что мы и ожидали при случайном наборе путей.

30 голосов
/ 15 июля 2010

Мне не нравится идея 404 начинать каждый файл с точки. Я бы использовал более избирательный подход, либо с cvs, которые я использую в проекте (svn в примере)

RedirectMatch 404 /\\.svn(/|$)

или поймать все системы cvs

RedirectMatch 404 /\\.(svn|git|hg|bzr|cvs)(/|$)

- следует устаревший ответ (см. Комментарии) -

Я пока не могу писать комментарии, так что ... Ответ csexton неверен, потому что пользователь не может получить доступ к папке .svn, но может получить доступ к любым файлам внутри нее! например вы можете получить доступ http://myserver.com/.svn/entries

Правильное правило:

RedirectMatch 404 /\\.svn(/.*|$)
14 голосов
/ 13 марта 2011

Я думаю, что Риккардо Галли понял это правильно. Даже в apache уже были настроены .svn как запрещенные для меня, но .svn / records был определенно доступен ... предоставил мой svn-сервер, номер порта, имена пользователей и т. Д.

На самом деле я понимаю, почему бы не ограничить .git в качестве превентивной меры (скажем, вы еще не используете git, но, возможно, когда-нибудь вы не будете думать об ограничениях каталога).

И тогда я подумал: а почему бы не ограничить все, что должно быть скрыто? Может кто-нибудь представить себе проблему с этим?

RedirectMatch 404 /\\..*(/.*|$)

Я добавил '. *' После начального периода - единственное отличие от Риккардо. Кажется до 404 .SVN, .Git, .blah, и т. Д.

6 голосов
/ 18 апреля 2012

Я бы предпочел запретить доступ ко всем точечным файлам (например, .htaccess, .svn, .xxx и т. Д.), Поскольку они обычно не должны быть доступны через Интернет.

Вот правило для достижения этого (пока не включен Apache 2.2):

<LocationMatch "\/\..*">
    Order allow,deny
    Deny from all
</LocationMatch>

(ОБНОВЛЕНИЕ) Или вы можете использовать следующее (работает в Apache 2.2 и 2.4):

# Deny access to dot-files, as 404 error
# (not giving hint about potential existence to the file)
RedirectMatch 404 ".*\/\..*"
2 голосов
/ 08 апреля 2013

Это:

RedirectMatch permanent .*\.(svn|git|hg|bzr|cvs)/.* /

также можно использовать, если вы не хотите отправлять ошибку пользователю.

Это только перенаправление на корневую страницу сайта. Кроме того, это постоянное перенаправление, поэтому роботы не будут пытаться переиндексировать этот URL.

1 голос
/ 15 февраля 2019

RedirectMatch, как и другие директивы из mod_alias, чувствителен к регистру даже в нечувствительных к регистру файловых системах (см. документация mod_alias ). Таким образом, приведенные выше ответы о сопоставлении и блокировке файлов всех систем контроля версий не верны.

Вместо

RedirectMatch 404 /\\.(svn|git|hg|bzr|cvs)(/|$)

или

RedirectMatch permanent .*\.(svn|git|hg|bzr|cvs)/.* /

что-то вроде этого необходимо

RedirectMatch 404 "(?i)/\.?(cvs|svn|git|hg|bzr)"

чтобы действительно заблокировать все, потому что

  • Каталоги CVS прописные; и
  • не начинайте с точки (.) Впереди.

Надеюсь, это поможет.

1 голос
/ 19 апреля 2016

Часто задаваемые вопросы по Apache Subversion предлагают это решение:

# Disallow browsing of Subversion working copy administrative dirs.
<DirectoryMatch "^/.*/\.svn/">
    Order deny,allow
    Deny from all
</DirectoryMatch>

источник: https://subversion.apache.org/faq.html#website-auto-update

1 голос
/ 13 июля 2011

Мне не очень нравится RedirectMatch, поэтому я использовал RewriteRule:

RewriteRule /\..*(/.*|$) - [R=404,L]

Дефис означает «не делай никакой замены». Я также не мог понять, почему в приведенных выше примерах регулярное выражение имеет две обратные косые черты:

/\\..*(/.*|$)

Итак, я вытащил один, и он отлично работает. Я не могу понять, почему вы использовали бы два там. Кто-нибудь хочет меня просветить?

1 голос
/ 23 мая 2011

Мне кажется, Apache conf должен быть:

<Directory ~ "\.svn">
    Order allow,deny
    Deny from all
</Directory>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...