Jadikan web direktori .git tidak dapat diakses

129

Saya memiliki situs web yang saya gunakan github (sumber tertutup) untuk melacak perubahan dan memperbarui situs. Satu-satunya masalah adalah, tampaknya direktori .git dapat diakses melalui web. Bagaimana saya bisa menghentikan ini dan masih bisa menggunakan git?

Haruskah saya menggunakan .htaccess? Haruskah saya mengubah izin .git?

Chris Muench
sumber
harus di serverfault
tback
8
Ada di serverfault: serverfault.com/questions/128069/…
scribu

Jawaban:

39

Buat .htaccessfile di .gitfolder dan letakkan yang berikut di file ini:

Order allow,deny
Deny from all

Tetapi perhatikan, bahwa itu akan hilang jika Anda pernah mengkloning ulang repositori

Pencuri
sumber
38
Benar, tetapi saya akan merekomendasikan untuk tidak meletakkannya di .git/direktori itu sendiri karena itu akan hilang jika Anda pernah mengkloning ulang repositori.
Jake Wharton
Ini menyakitkan jika Anda memiliki lebih dari satu direktori .git, dan harus dilakukan kembali jika Anda pernah mengkloning kembali direktori tersebut.
Bennett McElwee
1
Saya mencoba ini & ternyata berfungsi TETAPI ini dan tampaknya solusi APA PUN yang menempatkan pengaturan ini dalam .git / memiliki 2 kelemahan yang disebutkan di atas, yang pertama tampak paling buruk, ditambah yang ke-3 mungkin yang terburuk: kutipan (Make .git direktori web tidak dapat diakses), termasuk bagaimana itu dilakukan ketika & oleh siapa, kecil tapi masih kunci untuk data (terutama untuk keamanannya, termasuk analisis ketika & sebelum tidak dilakukan dengan benar) TETAPI di .git / itu BUKAN benar-benar bagian dari data yang tepat ( termasuk versi & dibagikan & terpelihara dengan baik) sehingga juga TIDAK dipulihkan ... analog dengan satu .gitignore terbaik dengan data yang tepat dan tidak dalam .git /.
Destiny Architect
3
Mengapa ini jawaban yang diterima dan bukan jawaban Bennet? Tekniknya sederhana dan efektif untuk menyelesaikan ini.
Josh Frankel
1
Kemungkinan besar karena OP menerima ini dua tahun sebelum yang lain diposting;)
ThiefMaster
379

Masukkan ini dalam .htaccessfile di root server web Anda:

RedirectMatch 404 /\.git

Solusi ini kuat dan aman : itu

  • berfungsi untuk semua .gitdirektori di situs Anda, bahkan jika ada lebih dari satu,
  • juga menyembunyikan file Git lain seperti .gitignoredan.gitmodules
  • bekerja bahkan untuk .gitdirektori yang baru ditambahkan , dan
  • bahkan tidak memberikan fakta bahwa direktori ada.
Bennett McElwee
sumber
1
Ini berfungsi pada .gitfolder, tetapi saya masih bisa mendapatkan .gitignorefile untuk ditarik.
Kurt Emch
Regex saya berfungsi dalam pengujian saya, dan harus bekerja sesuai dengan dokumentasi RedirectMatch karena regex hanya harus cocok dengan bagian dari URL, bukan URL lengkap: lihat catatan "perbedaan halus" dalam dokumentasi AliasMatch yang ditautkan . Tetap saja, dokumen adalah satu hal, dunia nyata adalah hal lain. @Artlogic regex tidak cocok dengan URL lengkap, jadi mungkin ada beberapa perbedaan versi di Apache atau saya hanya salah baca.
Bennett McElwee
2
@BennettMcElwee - setelah melihat lebih dekat pada dokumentasi, dan menjalankan beberapa tes, sepertinya wildcard tidak diperlukan untuk saya. Terima kasih atas solusinya. Bagus sekali!
artlogic
Menurut apache2 docs Anda juga dapat memasukkannya ke dalam konteks konfigurasi lain:server config, virtual host, directory, .htaccess
bennos
Saya bahkan menyarankan untuk menambahkan ". *" Di akhir ekspresi, sehingga tidak ada file / folder di bawah .git / dapat diakses ->RedirectMatch 404 /\.git.*
Dimitri Hautot
33

Keduanya .htaccessdan izin pada .git/folder akan berfungsi. Saya merekomendasikan yang pertama:

<Directory .git>
    order allow,deny
    deny from all
</Directory>
Jake Wharton
sumber
Apakah ada cara lain untuk dilakukan dengan apache karena saya tidak diizinkan menggunakan arahan <Directory> karena pengaturan server.
Chris Muench
2
Ada berbagai macam cara untuk mencocokkan (misalnya <Files>,, <FilesMatch>).
Jake Wharton
4
Jawaban ini sangat salah - Direktori tidak diperbolehkan dalam file .htaccess. Itu tidak tergantung pada pengaturan server.
ditandai ganda
2
NI8VDY = Gagal dalam 1 dari 1 kali saya sudah mencobanya: pada Dreamhost shared hosting, saya meletakkan ini di root situs web .htaccess lalu http: ke root situs web memberikan kuota kesalahan log server (.. <Direktori tidak diizinkan di sini). 2 komentator sudah mengetahui masalah ini & terakhir mengatakan kutipan (Direktori tidak diperbolehkan dalam file .htaccess) & lihat dokumen Direktori resmi httpd.apache.org/docs/current/mod/core.html#directory say quote (Konteks: server config, virtual host) dan bukan .htaccess. Tapi ini memiliki suara 26, jadi mereka yang mencari cara untuk menyelesaikan ini dari .htaccess, PLS UPDATE THE SOLUTION menjelaskan.
Destiny Architect
Setuju dengan @DestinyArchitect - maaf untuk downvote, tapi ini menyesatkan.
kael
7

Saya tidak ingin muck di dalam .gitdirektori dan tidak bisa mendapatkan solusi Bennett untuk bekerja di Apache 2.2, tetapi menambahkan berikut ini untuk <VirtualHost>konfigurasi saya berhasil:

RewriteRule ^.*\.git.* - [R=404]
David Moles
sumber
5

Saya tidak nyaman dengan mengontrol akses ke folder .git saya secara individual dan memilih untuk melakukannya melalui konfigurasi apache daripada .htaccess, untuk mencegah saya menimpa mereka, atau lupa pada instalasi baru dll.

Berikut adalah beberapa petunjuk terperinci yang harap mereka bantu. Saya menggunakan Ubuntu 16.10.

  1. Pertama periksa apa yang terjadi jika Anda menavigasi ke folder .git di browser. Dalam kasus saya, saya diberikan daftar direktori. Jika Anda melihat apa yang seharusnya tidak Anda lihat (mis. Anda tidak mendapatkan 404), lakukan hal berikut.
  2. Gunakan apache2ctl -V untuk mendapatkan HTTPD_ROOT dan SERVER_CONFIG_FILE
  3. Gunakan ini untuk mengedit konfigurasi apache Anda, dalam kasus saya $ sudo nano /etc/apache2/apache2.conf
  4. Tambahkan berikut ini di suatu tempat dalam file konfigurasi: RedirectMatch 404 /.git
  5. Restart apache: $ sudo service apache2 restart
  6. Seharusnya sekarang Anda mendapatkan 404 jika Anda menavigasi ke folder lagi
  7. Saya mencoba ini dengan .gitignore dan juga mendapat 404
Chris B
sumber
4

Opsi yang lebih kuat dan sederhana akan menonaktifkan izin BACA dan Eksekusi dari .gitdirektori.

Karena sebagian besar Apache (httpd) berjalan di bawah akun pengguna khusus, misalnya, ia berjalan sebagai pengguna apachedi CentOS, sedangkan .gitdirektori harus dibuat di bawah akun pengguna nyata, jadi kami hanya dapat memblokir akses dengan mengubah izin. Selain itu, pendekatan ini tidak memperkenalkan file baru, atau memengaruhi perintah git.

Perintahnya bisa:

chmod -R o-rx .git
hailong
sumber
Pada mesin di mana SA tidak ingin penggunaan .htaccess dan tidak ingin saya mengacaukan file jenis httpd.conf mereka, ini tampaknya menjadi solusi terbaik.
Alien Life Form
1
Kelemahan yang jelas adalah bahwa jika Anda mengkloning ulang, Anda harus ingat untuk berlari chmodlagi.
Lauri Nurmi
3

mod_rewrite akan memberi Anda pengaruh yang diinginkan:

RewriteEngine on
RewriteRule .*\.git/.* - [F]
Huh
sumber
9
Ini adalah kerentanan pengungkapan informasi: ini memudahkan orang untuk menentukan keberadaan .gitdirektori karena mengembalikan kode terlarang daripada Tidak Ditemukan.
Bennett McElwee
2
Ini bukan kerentanan untuk menggunakan git
Adam
1

Alih-alih mengacaukan .htaccessaturan seperti kebanyakan jawaban menyarankan, mengapa tidak meletakkan .git/direktori di atas webroot?

Dalam pengaturan saya, .gitdirektori saya biasanya hidup dalam sesuatu seperti:

/home/web/project_name/.git/

Kode aktual saya tinggal di

/home/web/project_name/www_root/

karena root web saya (sebagaimana didefinisikan pada Apache atau Nginx .. Saya lebih suka yang terakhir) adalah /home/web/project_name/www_root/tidak ada cara .gitdirektori dapat diakses dari web karena ia hidup "lebih tinggi" daripada webroot

Javier Larroulet
sumber
jadi public_html adalah subdirektori dari repo yang berfungsi ?? terdengar menarik
Hayden Thring
Tidak, ini bukan subdirektori. Mereka berdua "saudara" dalam direktori proyek utama saya. project_nameDirektori saya memiliki dua subdirektori: di www_rootmana file-file itu benar-benar disajikan ketika pengunjung menelusuri situs saya, dan di .gitmana repo berada. Menarik dari pembaruan repo www_rootdan isinya. Masalahnya adalah, karena .gitdirektori secara hierarkis "di atas" pengontrol depan saya, itu tidak dapat diakses melalui web.
Javier Larroulet
Saya pikir inilah yang saya maksud, jadi Anda memiliki / home / user / public_html / dan /home/user/.git
Hayden Thring
wow itu solusi jenius yang mudah dan sederhana, (bukan berarti membuat blok server lebar di apache security.conf sulit) satu-satunya hal yang harus diperhatikan adalah jika hosting Anda memiliki beberapa pengaturan kepemilikan / izin aneh di publlic_html, yang mungkin bisa berubah.
Hayden Thring
1
sangat benar ... Saya sebenarnya memiliki "direktori saudara" lainnya untuk keperluan lain yang tetap tidak dapat diakses dari web, yang memungkinkan saya untuk tidur sedikit lebih baik di malam hari :)
Javier Larroulet