.Git dizin webini erişilemez hale getirin


129

Değişiklikleri izlemek ve siteyi güncellemek için github (kapalı kaynak) kullandığım bir web sitem var. Tek sorun, .git dizininin web üzerinden erişilebilir görünmesidir. Bunu nasıl durdurabilirim ve yine de git'i kullanabilirim?

.Htaccess kullanmalı mıyım? .Git izinlerini değiştirmeli miyim?


serverfault'da olmalı
tback

Yanıtlar:


39

Klasörde bir .htaccessdosya oluşturun .gitve aşağıdakileri bu dosyaya koyun:

Order allow,deny
Deny from all

Ancak, depoyu yeniden klonlarsanız kaybolacağını unutmayın.


38
Doğru, ancak .git/dizinin kendisine koymamanızı tavsiye ederim çünkü depoyu yeniden klonlarsanız kaybolur.
Jake Wharton

Birden fazla .git dizininiz varsa bu bir sıkıntıdır ve dizini yeniden klonlarsanız yeniden yapılması gerekir.
Bennett McElwee

1
Bunu denedim ve işe yaradığını buldum AMA bu ve görünüşe göre bu ayarı .git içine koyan HERHANGİ bir çözüm / yukarıda belirtilen 2 dezavantaja sahip, 1'inci en kötü görünen, artı üçüncü belki de en kötüsü: alıntı (.git dizin web yap erişilemez), ne zaman ve kim tarafından yapıldığının nasıl küçük olduğu da dahil olmak üzere, ancak yine de verilerin anahtarıdır (özellikle güvenliği için, doğru şekilde ve daha önce yapılmadan yapılan analiz dahil) ANCAK gerçek verilerin bir parçası DEĞİLDİR ( sürüme sahip ve paylaşılan ve iyi korunmuş dahil) bu nedenle de geri yüklenmez ... en iyi .gitignore yerine .git /.
Destiny Architect

3
Bu neden Bennett'in değil de kabul edilen cevap? Bunu çözmek için basit ve etkili bir tekniktir.
Josh Frankel

1
Büyük olasılıkla OP bunu diğerinin yayınlanmasından iki yıl önce kabul ettiği için;)
ThiefMaster

379

Bunu web sunucunuzun kök dizinindeki bir .htaccessdosyaya koyun :

RedirectMatch 404 /\.git

Bu çözüm sağlam ve güvenlidir :

  • .gitbirden fazla olsa bile sitenizdeki tüm dizinler için çalışır ,
  • ayrıca .gitignoreve gibi diğer Git dosyalarını da gizler.gitmodules
  • yeni eklenen .gitdizinler için bile çalışır ve
  • dizinlerin var olduğu gerçeğini bile açığa çıkarmaz.

1
.gitKlasör üzerinde çalıştı , ancak .gitignoredosyayı açmaya devam edebildim .
Kurt Emch

Benim regex benim test çalışır ve gerektiği göre çalışmak RedirectMatch belgelerinde regex sadece URL'yi değil, tam URL kısmını eşleşecek şekilde olduğundan: bağlantılı de "ince bir fark" nota bakın AliasMatch belgelerinde . Yine de dokümanlar bir şey, gerçek dünya başka bir şey. @Artlogic regex tam URL ile eşleşiyor, bu yüzden Apache'de bazı sürüm farklılıkları olabilir veya ben sadece yanlış okuyorum.
Bennett McElwee

2
@BennettMcElwee - belgelere daha yakından baktıktan ve birkaç test yaptıktan sonra, joker karakterlerin benim için gerekli olmadığı anlaşılıyor. Çözüm için teşekkürler. Harika çalışıyor!
artlogic

server config, virtual host, directory, .htaccess
Apache2

Hatta ifadenin sonuna ". *" Eklemeyi bile öneririm, böylece .git / altındaki hiçbir dosya / klasöre erişilemez ->RedirectMatch 404 /\.git.*
Dimitri Hautot

33

Klasör .htaccessüzerindeki hem izinler hem .git/de çalışır. İlkini tavsiye ederim:

<Directory .git>
    order allow,deny
    deny from all
</Directory>

Sunucu ayarlarından dolayı <Directory> yönergesini kullanmama izin verilmediğinden apache ile yapmanın başka bir yolu var mı?
Chris Muench

2
Eşleştirmenin her türlü yolu vardır (örneğin <Files>,, <FilesMatch>).
Jake Wharton

4
Bu yanıt tamamen yanlıştır - .htaccess dosyalarında dizine izin verilmez. Sunucu ayarlarına bağlı değildir.
doublemark

2
NI8VDY = Denedim 1 defasında 1 başarısız oldu: Dreamhost paylaşımlı barındırmada, bunu web sitesinin kök .htaccess'ine koydum ve sonra http: web sitesi köküne sunucu günlükleri hata teklifi verdi (.. <Burada dizine izin verilmiyor). 2 yorumcu zaten bu soruna karşı uyardı ve son alıntı (.htaccess dosyalarında dizine izin verilmez) ve resmi Dizin belgelerine bakın httpd.apache.org/docs/current/mod/core.html#directory alıntı söyle (Bağlam: sunucu config, sanal konak) ve .htaccess değil. Ancak bunun 26 oyu var, bu yüzden bunu .htaccess üzerinden nasıl çalıştıracaklarını bulanlar, PLS ÇÖZÜMÜ GÜNCELLE açıklıyor.
Destiny Architect

@DestinyArchitect ile aynı fikirde olun - olumsuz oy için üzgünüz, ancak bu yanıltıcıdır.
kael

7

.gitDizini karıştırmak istemedim ve Bennett'in çözümünün Apache 2.2'de çalışmasını sağlayamadım , ancak <VirtualHost>yapılandırmama aşağıdakileri eklemek işe yaradı:

RewriteRule ^.*\.git.* - [R=404]

5

.Git klasörlerime erişimi tek tek kontrol etme konusunda rahat değilim ve bunların üzerine yazmamı veya yeni bir yüklemeyi unutmamı önlemek için .htaccess yerine apache yapılandırması yoluyla yapmayı seçiyorum.

İşte yardımcı olacağını umduğumuz bazı ayrıntılı talimatlar. Ubuntu 16.10 kullanıyorum.

  1. Önce bir tarayıcıda .git klasörüne giderseniz ne olacağını kontrol edin. Benim durumumda bir rehber listesi sunuldu. Görmemeniz gereken şeyi görüyorsanız (yani 404 alamıyorsanız), aşağıdakileri yapın.
  2. HTTPD_ROOT ve SERVER_CONFIG_FILE'yi almak için apache2ctl -V kullanın
  3. Apache yapılandırmanızı düzenlemek için bunu kullanın, benim durumumda $ sudo nano /etc/apache2/apache2.conf
  4. Aşağıdakileri yapılandırma dosyasında bir yere ekleyin: RedirectMatch 404 /.git
  5. Apache'yi yeniden başlatın: $ sudo service apache2 restart
  6. Klasöre tekrar giderseniz şimdi size bir 404 vermeli
  7. Bunu .gitignore ile denedim ve ayrıca 404 aldım

4

Daha sağlam ve basit bir seçenek, .gitdizinin OKUMA ve Yürütme iznini devre dışı bırakmak olabilir .

Çoğunlukla Apache (httpd) özel bir kullanıcı hesabı altında çalıştığından, örneğin, apacheCentOS üzerinde kullanıcı olarak çalışır , .gitdizinin gerçek bir kullanıcı hesabı altında oluşturulması gerekir, böylece izni değiştirerek erişimi kolayca engelleyebiliriz. Dahası, bu yaklaşım yeni bir dosya sunmaz ve git komutlarını etkilemez.

Komut şu şekilde olabilir:

chmod -R o-rx .git

SA'ların .htaccess kullanımını istemediği ve httpd.conf -type dosyalarıyla uğraşmamı istemediği bir makinede, bu en iyi çözüm gibi görünüyor.
Alien Life Form

1
Bariz dezavantajı, eğer yeniden klonlarsanız, chmodtekrar koşmayı hatırlamanız gerekecek olmasıdır .
Lauri Nurmi

3

mod_rewrite size istediğiniz etkiyi verecektir:

RewriteEngine on
RewriteRule .*\.git/.* - [F]

9
Bu bir bilginin açığa çıkması güvenlik açığıdır: .gitBulunamadı yerine Yasak bir kod döndürdüğü için kişilerin dizinin varlığını belirlemesini kolaylaştırır .
Bennett McElwee

2
Git kullanmak bir güvenlik açığı değil
Adam

1

.htaccessÇoğu yanıtın önerdiği gibi kurallarla uğraşmak yerine , neden .git/dizini webroot'un üstüne koymuyorsunuz?

Kurulumumda, dizinim .gitgenellikle şöyle bir yerde bulunur:

/home/web/project_name/.git/

Gerçek kodum yaşıyor

/home/web/project_name/www_root/

(Ben ikinci tercih .. Apache veya Nginx üzerinde tanımlandığı gibi) benim web kökü beri olduğu /home/web/project_name/www_root/imkan yok .gito webroota daha "yüksek" yaşıyor çünkü dizin web üzerinden erişilebilir olabilir


yani public_html, repo çalışma dizininin bir alt dizini mi? ilginç geliyor
Hayden Thring

Hayır, bu bir alt dizin değil. Her ikisi de ana proje dizinimdeki "kardeşler". Benim project_namedizin iki alt dizinleri vardır: www_rootdosya aslında bir ziyaretçinin sitemde olacağını göz attığında sunulduğu ve .gitrepo olduğu. Repo güncellemelerinden www_rootve içeriğinden çekiliyor. Mesele şu ki, .gitdizin hiyerarşik olarak ön denetleyicimin "üstünde" olduğundan, web üzerinden erişilemez.
Javier Larroulet

Sanırım demek istediğim bu, yani / home / user / public_html / ve /home/user/.git var
Hayden Thring

vay bu çok kolay ve basit bir çözüm, dehası, (apache security.conf'da bir sunucu geniş bloğu yapmak zor değil) dikkat edilmesi gereken tek şey, barındırma hizmetinizin publlic_html'de bazı garip sahiplik / izin ayarlarına sahip olup olmadığıdır. değişebilir.
Hayden Thring

1
çok doğru ... Aslında web'den erişilemeyen başka amaçlar için başka "kardeş dizinlerim" var, bu da geceleri biraz daha iyi
uyumamı sağlıyor
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.