Apache'nin .git dizinine sunulmasını nasıl önlerim?


73

Git web sitelerini test etmek için kullanmaya başladım. Apache'nin .git dizini içeriğini sunmasını nasıl önlerim?

denedim

<Directorymatch "^/.*/\.svn/">
Order deny,allow
Deny from all
</Directorymatch>

başarı olmadan.

Her .git dizininde bir .htaccess dosyası oluşturabileceğimi ve erişimi engelleyebileceğimi biliyorum, ancak bunu tüm web sitelerinde global yapan ana config dosyasına koyabileceğim bir şey istiyorum.


3
Apache'nin dizine sunulmasını engelledikten sonra, dizinde etkin Dizinler etkinse, .git dizinini "IndexIgnore .git" ile de gizlemeniz gerekebilir.
Ryan,

Yanıtlar:


53

Çalışmıyor çünkü 'svn' ve kuralda 'git' yok. Tek yapmanız gereken 'svn' 'git' ile değiştirmektir.

<Directorymatch "^/.*/\.git/">
Order deny,allow
Deny from all
</Directorymatch>

1
Yalnızca kodunuzu içeren bir .htaccess oluşturduğumda, şu hatayı alıyorum: "<DirectoryMatch buraya izin verilmedi"
Shoan


2
En basit regex<DirectoryMatch /\.git/>
Bachsau

Kusursuz çözüm için bunu kontrol edin magento.stackexchange.com/questions/202840/…
Pratik Kamani

1, şarkı / OP sayesinde. Apache 2.4'te "Order, reddet" ve bir sonraki satırın "Tümünü reddet" iste ile değiştirildiğini unutmayın. Ayrıca, yukarıdaki "Apache conf" adlı dosyanın adı "httpd.conf" olarak adlandırılan birçok kurulum --- singping kullanımı yalnızca sıradan bir deyimdir, bu nedenle bu değişmez adı aramayın (muhtemelen söylemeden gitmeli, ama asla bilmezsiniz) insanlar nasıl okuyabilirdi).
Kevin_Kinsey

139

Bu, diğer cevapların çoğu ile aynı etkiye sahiptir, ancak çok daha basittir:

RedirectMatch 404 /\.git

Bu, içine .htaccessveya sunucu yapılandırma dosyanıza gidebilir . Bir 404 döndürerek adı .git(örneğin bir .gitdizin veya .gitignoredosya) ile başlayan herhangi bir dosyayı veya dizini gizler . Bu nedenle, yalnızca Git repo'nuzun içeriği gizli değil, varlığı da gizlidir.


2
Bu çözümü gerçekten beğendim. Çok basit ve zarif.
Shoan

2
Bunu kök dizine koymak htdocs dizini de küresel bir iş yapar.
jor

4
Bu seçeneği de en iyisini seviyorum. /.Git veya /.gitignore gibi talepler için bir 404'ü iade etmenin daha güvenli olduğunu ve böylece git'in bile kullanılmakta olduğu gerçeğinin dışarıdan tespit edilemeyeceği anlaşılıyor.
Ezra Ücretsiz,

2
Dizin listelerini etkinleştirmişseniz, .gitklasörlerin görünmeye devam edeceğini, ancak erişmeye çalıştığınızda 404'ü alacağınızı unutmayın.
Andy Madge,

1
@BennettMcElwee evet, üretim prodüksiyonunda global olarak dizin listesinin etkinleştirilmesi için hiçbir zaman iyi bir neden yoktur. Sadece birini yakalaması durumunda bir konuşmayı hak ettiğini düşündüm.
Andy Madge

13

.Htaccess dosyalarını kullanmıyor ancak bunun yerine /etc/apache2/httpd.conf (veya sunucunuzun ana conf dosyası ne olursa olsun) kullanmak istiyorsanız, hem .git dizinlerini hem de .gitignore dosyalarını gizlemek için aşağıdakileri kullanabilirsiniz. Master conf ayarı için yukarıdaki cevabı buldum gitignore dosyasını gizlemedi.

# do not allow .git version control files to be issued
<Directorymatch "^/.*/\.git+/">
  Order deny,allow
  Deny from all
</Directorymatch>
<Files ~ "^\.git">
    Order allow,deny
    Deny from all 
</Files>

1
www.example.com/.git/configApache httpd 2.4.27'deki dosyayı engellemeyin .
ilhan

12

Paylaşılan bir barındırma hizmetindeyseniz ve apache.conf dosyasına erişemiyorsanız , .htaccess dosyanızda aşağıdaki gibi yapabilirsiniz:

RewriteEngine On
RewriteRule "^(.*/)?\.git/" - [F,L]

teşekkürler bu benim için çalıştı en iyi cevabın olmadığı paylaşılan bir barındırma durumunda
Plato

6
### never deliver .git folders, .gitIgnore
RewriteRule ^(.*/)?\.git+ - [R=404,L]

# 2nd line of defense (if no mod_rewrite)
RedirectMatch 404 ^(.*/)?\.git+

Bu çalışır .htaccess, http.conferişim gerekmez. Bunu, yeniden yazma kurallarının ilki olarak ekleyin. Gerekirse Prepend Rewrite On.

Güvenlik açısından, saldırgan hakkında daha bilgilendirici bir 403 üzerinden sahte 404'ü tercih ederim. Diğerinin de sizin için çalışmasını sağlamak için ikisinden birini yorumlayın.

Btw, iyi değişiklikler, ikisi için lithmus testiniz:

http://localhost/.gitignore
http://localhost/.git/HEAD

Neden her iki kuralı var? Basit RedirectMatch kendi başına yeterli olur. (Ayrıca, regexes oldukça doğru görünmüyor - neden artı artı?)
Bennett McElwee

Kişisel Paranoya / güvenlik ikiye katlandı. Eğer RewriteEngine kapanırsa (merkezi yapılandırma değişiklikleri, kötü ekip iletişimi, şanssız sunucu "güncelleme", ... siz onu adlandırın :-) + + eski veya $, iyi bir nokta olmalı! (test için zaman yok, üzgünüm.)
Frank Nocke

RewriteEngine'in kapalı olabileceğinden endişeleniyorsanız, sadece RewriteEngine OnRewriteRule'nuzun önüne koyun . Ama her nasılsa, bu basit ve gereksiz çünkü daha basit RedirectMatch kendi başına yetiyor. Bu bile basitleştirilmiş olabilir. Temelde cevabımı bunun yerine tavsiye ediyorum . :)
Bennett McElwee,

Turnusol testi için +1.

5

Hem .git dizinini hem de .gittacore ve .gitmodules gibi diğer dosyaları .htaccess kullanarak korumak için şunları kullanın:

RewriteEngine On
RewriteRule ^(.*/)?\.git+ - [F,L]
ErrorDocument 403 "Access Forbidden"

4
Benim için çalışıyor, ancak sondaki ErrorDocument'ın etkisi yok. Güvenlik açısından, bilgilendirici bir 403 üzerinden saldırgana 404 sahte bir sahte takılmak isterdim ...
Frank Nocke

1
Bu kötü bir fikir, çünkü bilgisayar korsanlarına bilgi veriyor. Bir 403 orada olduğu anlamına gelir, bir 404 olmadığı anlamına gelir. Bir sunucunun kurulumundaki her gerçek bir bilgisayar korsanı için kullanışlıdır. Bunu revize etmeyi düşünürdüm.
GerardJP

3

Her zaman aşağıdaki satırı vhost şablonuna eklerim

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

Sadece kimsenin VCS'ye özel verilere erişemeyeceğinden emin olmak için. Mükemmel çalışıyor


1

Web sunucunuzun .git deposuna erişmek için kullandığınızdan farklı bir kullanıcı kullandığını varsayarsak, .git dizinindeki diğerleri için execute bit'i devre dışı bırakabilirsiniz.

Bu, diğer web sunucuları ile çalışmalı ve performans gerektiren .htaccess dosyalarına dayanmamalıdır.


1

Linux dağıtımındaki tüm "gizli" dosyaları ve dizinleri basitçe reddetmek isteyenler için (genellikle "." İle başlayan tüm dosyalar), sunucu yapılandırma bağlamına yerleştirildiğinde Apache 2.4'te çalışanlar:

<FilesMatch "^\.(.*)$">
    Require all denied
</FilesMatch>
<DirectoryMatch "/\.(.*)">
    Require all denied
</DirectoryMatch>

Ve işte eski Apache 2.2 tarzı (aynı regex, sadece farklı auth yönergeleri):

<FilesMatch "^\.(.*)$">
    Order deny,allow
    Deny from all
</FilesMatch>
<DirectoryMatch "/\.(.*)">
    Order deny,allow
    Deny from all
</DirectoryMatch>

O zaman .gitya da .svnözellikle endişelenmenize gerek yok . Bu aynı zamanda gibi .htaccessve .htpasswddoğal olan şeylerle de eşleşir .

Şahsen, 404'ler yerine bu tür isteklere 403'ler vermeyi seviyorum, ancak benzer şekilde reddetmek yerine kolayca bir RewriteRule kullanabilirsiniz:

<FilesMatch "^\.(.*)$">
    RewriteRule "^(.*)$" - [R=404,L]
</FilesMatch>
<DirectoryMatch "/\.(.*)">
    RewriteRule "^(.*)$" - [R=404,L]
</DirectoryMatch>

0

Muhtemelen hizmet etmeyi de reddetmek istersiniz .gitignore.

Nokta ile başlayan dosyalar Linux'ta gizlidir.

Bu nedenle, sadece bir nokta ile başlayan herhangi bir şey 404:

RedirectMatch 404 /\.


0

Bu biraz geç ama cevabım biraz farklı, bu yüzden ekleyeceğimi düşündüm. Bu httpd.conf dosyasına gitmeli. <Files "*">İçine yuvalanmış <Directory>dizindeki tüm dosyaları engeller etiketi.

# GitHub Directory
<Directory /var/www/html/yoursite/.git>
   Order Deny,Allow
   Deny from all
   <Files "*">
     Order Deny,Allow
     Deny from all
   </Files>
</Directory>
# GitHub files
<Files .gitignore>
  order Deny,Allow
  Deny from all
</Files>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.