ทำให้เว็บไดเรกทอรี. git ไม่สามารถเข้าถึงได้


129

ฉันมีเว็บไซต์ที่ฉันใช้ GitHub (ปิดแหล่งที่มา) เพื่อติดตามการเปลี่ยนแปลงและปรับปรุงเว็บไซต์ ปัญหาเดียวคือมันจะปรากฏไดเรกทอรี. git สามารถเข้าถึงได้ผ่านทางเว็บ ฉันจะหยุดสิ่งนี้และยังสามารถใช้คอมไพล์ได้อย่างไร

ฉันควรใช้. htaccess หรือไม่ ฉันควรเปลี่ยนสิทธิ์ของ. git หรือไม่


ควรอยู่ในความ
ผิดพลาดของเซิร์ฟเวอร์

8
อยู่ใน serverfault: serverfault.com/questions/128069/…
scribu

คำตอบ:


39

สร้าง.htaccessไฟล์ใน.gitโฟลเดอร์และใส่ต่อไปนี้ในไฟล์นี้:

Order allow,deny
Deny from all

แต่โปรดทราบว่ามันจะหายไปถ้าคุณโคลนที่เก็บอีกครั้ง


38
จริง แต่ฉันอยากจะแนะนำให้วางไว้ใน.git/ไดเรกทอรีของตัวเองเพราะมันจะหายไปถ้าคุณโคลนที่เก็บอีกครั้ง
Jake Wharton

นี่เป็นความเจ็บปวดหากคุณมีไดเรกทอรี. git มากกว่าหนึ่งรายการและจะต้องทำอีกครั้งหากคุณทำซ้ำไดเรกทอรีอีกครั้ง
Bennett McElwee

1
ฉันลองมันแล้วพบว่ามันใช้งานได้ แต่มันก็ดูเหมือนว่าจะแก้ปัญหาใด ๆ ที่ทำให้การตั้งค่านี้อยู่ใน. git / มีข้อเสีย 2 ข้อที่กล่าวมาข้างต้นข้อที่ 1 ดูแย่ที่สุดและอันดับที่สามอาจแย่ที่สุดทั้งหมด ไม่สามารถเข้าถึงได้) รวมถึงวิธีการที่ทำเมื่อ & โดยใครมีขนาดเล็ก แต่ยังคงเป็นกุญแจสำคัญในข้อมูล (esp เพื่อความปลอดภัยของมันรวมถึงการวิเคราะห์เมื่อ & ก่อนไม่ถูกต้อง) แต่ใน. git / มันไม่ได้เป็นส่วนหนึ่งของข้อมูลที่เหมาะสม รวมถึงเวอร์ชัน & แชร์ & เก็บรักษาไว้เป็นอย่างดี) ดังนั้นจึงไม่ถูกเรียกคืน ... คล้ายกับ. gitignore ที่ดีที่สุดที่มีข้อมูลที่เหมาะสมและไม่อยู่ใน. git /
Destiny Architect

3
ทำไมคำตอบนี้จึงเป็นที่ยอมรับและไม่ใช่ของเบนเน็ตต์ เขาเป็นเทคนิคที่ง่ายและมีประสิทธิภาพในการแก้ปัญหานี้
Josh Frankel

1
น่าจะเป็นเพราะ OP ยอมรับหนึ่งนี้สองปีก่อนอีกโพสต์หนึ่ง;)
ThiefMaster

379

วางสิ่งนี้ลงใน.htaccessไฟล์ที่รูทของเว็บเซิร์ฟเวอร์ของคุณ:

RedirectMatch 404 /\.git

โซลูชันนี้แข็งแกร่งและปลอดภัย :

  • ใช้งานได้กับ.gitไดเรกทอรีทั้งหมดในเว็บไซต์ของคุณแม้ว่าจะมีมากกว่าหนึ่งไดเรกทอรี
  • ยังซ่อนไฟล์ Git อื่น ๆ เช่น.gitignoreและ.gitmodules
  • ทำงานได้แม้กับ.gitไดเรกทอรีที่เพิ่มใหม่และ
  • ไม่ได้บอกความจริงว่ามีไดเรกทอรีอยู่

1
มันใช้งานได้ใน.gitโฟลเดอร์ แต่ฉันก็ยังสามารถ.gitignoreดึงไฟล์ขึ้นมาได้
Kurt Emch

regex ของฉันทำงานในการทดสอบของฉันและควรทำงานตามเอกสาร RedirectMatchตั้งแต่ regex มีเพียงเพื่อให้ตรงกับส่วนหนึ่งของ URL ที่ไม่ URL แบบเต็ม: ดู "แตกต่างที่ลึกซึ้ง" โน้ตในการเชื่อมโยงเอกสาร AliasMatch ถึงกระนั้นเอกสารก็เป็นสิ่งหนึ่งโลกแห่งความจริงก็เป็นอีกสิ่งหนึ่ง @artlogic regex ตรงกับ URL เต็มรูปแบบดังนั้นอาจมีความแตกต่างของรุ่นใน Apache หรือฉันแค่อ่านสิ่งต่าง ๆ ผิด
Bennett McElwee

2
@BennettMcElwee - หลังจากดูเอกสารอย่างละเอียดมากขึ้นและทำการทดสอบสองสามครั้งดูเหมือนว่าอักขระตัวแทนไม่จำเป็นสำหรับฉันเลย ขอบคุณสำหรับการแก้ปัญหา ใช้งานได้ดี!
artlogic

ตามเอกสาร apache2คุณยังสามารถใส่ลงในบริบทการตั้งค่าอื่น ๆ :server config, virtual host, directory, .htaccess
bennos

ฉันยังขอแนะนำให้เพิ่ม ". *" ในตอนท้ายของนิพจน์เพื่อให้ไม่มีไฟล์ / โฟลเดอร์ภายใต้. git / สามารถเข้าถึงได้ ->RedirectMatch 404 /\.git.*
Dimitri Hautot

33

ทั้ง.htaccessสิทธิ์และ.git/โฟลเดอร์จะใช้งานได้ ฉันแนะนำอดีต:

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

มีวิธีอื่นในการใช้ apache เนื่องจากฉันไม่ได้รับอนุญาตให้ใช้คำสั่ง <Directory> เนื่องจากการตั้งค่าเซิร์ฟเวอร์
Chris Muench

2
มีวิธีการจับคู่ทุกประเภท (เช่น<Files>,, <FilesMatch>)
Jake Wharton

4
คำตอบนี้ไม่ถูกต้องอย่างสิ้นเชิง - ไดเรกทอรีไม่ได้รับอนุญาตในไฟล์. htaccess มันไม่ได้ขึ้นอยู่กับการตั้งค่าเซิร์ฟเวอร์
doublemarked

2
NI8VDY = ล้มเหลวใน 1 ใน 1 ครั้งที่ฉันได้ลอง: ในโฮสติ้งที่ใช้ร่วมกันกับ Dreamhost ฉันใส่สิ่งนี้ลงใน. htaccess ของรูทเว็บไซต์แล้ว http: ไปยังรูทเว็บไซต์ให้เซิร์ฟเวอร์บันทึกข้อผิดพลาด (.. <ไดเรกทอรีไม่ได้รับอนุญาตที่นี่) มีผู้แสดงความคิดเห็น 2 คนแจ้งเตือนปัญหานี้แล้วและล่าสุดพูดว่า quote (ไดเรกทอรีไม่ได้รับอนุญาตในไฟล์. htaccess) & ดูเอกสารทางการของไดเรกทอรีhttpd.apache.org/docs/current/mod/core.html#directoryพูดข้อความ (บริบท: เซิร์ฟเวอร์ config, โฮสต์เสมือน) และดังนั้นไม่. htaccess แต่สิ่งนี้มี 26 คะแนนดังนั้นผู้ที่ค้นหาวิธีการทำงานจาก. htaccess ได้โปรดอัปเดตโซลูชันอธิบาย
Destiny Architect

เห็นด้วยกับ @DestinyArchitect - ขออภัยสำหรับ downvote แต่นี่เป็นสิ่งที่ทำให้เข้าใจผิด
kael


5

ฉันไม่สะดวกในการควบคุมการเข้าถึงโฟลเดอร์. git แยกจากกันและเลือกที่จะทำผ่าน apache config แทนที่จะเป็น. htaccess เพื่อป้องกันไม่ให้เขียนทับพวกเขาหรือลืมการติดตั้งใหม่ ฯลฯ

นี่คือคำแนะนำโดยละเอียดที่หวังว่าจะช่วยได้ ฉันใช้ Ubuntu 16.10

  1. ก่อนอื่นให้ตรวจสอบว่าเกิดอะไรขึ้นหากคุณนำทางไปยังโฟลเดอร์. git ในเบราว์เซอร์ ในกรณีของฉันฉันถูกนำเสนอด้วยรายการไดเรกทอรี หากคุณเห็นสิ่งที่ไม่ควรเห็น (เช่นคุณไม่ได้รับ 404) ให้ทำดังนี้
  2. ใช้ apache2ctl -V เพื่อรับ HTTPD_ROOT และ SERVER_CONFIG_FILE
  3. ใช้สิ่งนี้เพื่อแก้ไขการตั้งค่า Apache ของคุณในกรณีของฉัน $ sudo nano /etc/apache2/apache2.conf
  4. เพิ่มรายการต่อไปนี้ในไฟล์ปรับแต่ง: RedirectMatch 404 /.git
  5. รีสตาร์ท apache: $ sudo service apache2 ทำการรีสตาร์ท
  6. ตอนนี้คุณควรจะได้รับ 404 ถ้าคุณนำทางไปยังโฟลเดอร์อีกครั้ง
  7. ฉันลองมันด้วย. gignignore และได้รับ 404

4

ตัวเลือกที่แข็งแกร่งและเรียบง่ายจะปิดการใช้งานการอนุญาตการอ่านและการดำเนินการของ .gitไดเรกทอรี

เนื่องจาก Apache (httpd) ส่วนใหญ่ทำงานภายใต้บัญชีผู้ใช้พิเศษตัวอย่างเช่นทำงานเป็นผู้ใช้ apacheบน CentOS ในขณะที่.gitต้องสร้างไดเรกทอรีภายใต้บัญชีผู้ใช้จริงดังนั้นเราสามารถบล็อกการเข้าถึงโดยการเปลี่ยนการอนุญาต นอกจากนี้วิธีการนี้จะไม่แนะนำไฟล์ใหม่ใด ๆ และจะไม่มีผลกับคำสั่ง git

คำสั่งสามารถ:

chmod -R o-rx .git

บนเครื่องที่ไม่ต้องการการใช้งาน. htaccess และไม่ต้องการให้ฉันยุ่งกับไฟล์ httpd.conf -type ของพวกเขาสิ่งนี้ดูเหมือนจะเป็นทางออกที่ดีที่สุด
แบบฟอร์มชีวิต

1
ข้อเสียที่ชัดเจนคือถ้าคุณโคลนอีกครั้งคุณจะต้องจำให้ทำงานchmodอีกครั้ง
Lauri Nurmi

3

mod_rewrite จะให้ผลตามที่คุณต้องการ:

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

9
นี่เป็นช่องโหว่ของการเปิดเผยข้อมูล: ทำให้ผู้คนสามารถระบุถึงการมีอยู่ของ.gitไดเรกทอรีได้อย่างง่ายดายเพราะมันจะส่งคืนรหัสที่ต้องห้ามมากกว่าไม่พบ
Bennett McElwee

2
ไม่ใช่ช่องโหว่ในการใช้คอมไพล์
Adam

1

แทนที่จะยุ่งกับ.htaccessกฎอย่างที่คำตอบส่วนใหญ่แนะนำทำไมไม่วาง.git/ไดเรกทอรีไว้เหนือเว็บรูท

ในการตั้งค่าของฉัน.gitไดเรกทอรีของฉันมักจะอยู่ในสิ่งที่ชอบ:

/home/web/project_name/.git/

รหัสจริงของฉันอาศัยอยู่ใน

/home/web/project_name/www_root/

ตั้งแต่เว็บรูทของฉัน (ตามที่กำหนดไว้บน Apache หรือ Nginx .. ฉันชอบมากกว่านี้) /home/web/project_name/www_root/ไม่มีวิธีใดที่.gitไดเรกทอรีสามารถเข้าถึงได้จากเว็บเพราะมัน "ดีกว่า" กว่า webroot


ดังนั้น public_html เป็นส่วนย่อยของ repo ที่ทำงานอยู่ ?? ฟังดูน่าสนใจ
Hayden Thring

ไม่มันไม่ใช่ไดเรกทอรีย่อย พวกเขาทั้งสองเป็น "พี่น้อง" ในไดเรกทอรีโครงการหลักของฉัน project_nameไดเรกทอรีของฉันมีสองไดเรกทอรีย่อย: www_rootไฟล์ที่ให้บริการจริงเมื่อผู้เข้าชมเรียกดูเว็บไซต์ของฉันและ.gitที่ repo การดึงจากการอัพเดต repo www_rootและเนื้อหา สิ่งนั้นคือเนื่องจาก.gitไดเรกทอรีนั้นมีลำดับขั้น "เหนือ" ตัวควบคุมด้านหน้าของฉันจึงไม่สามารถเข้าถึงได้ผ่านเว็บ
Javier Larroulet

ฉันคิดว่านี่คือสิ่งที่ฉันหมายถึงดังนั้นคุณมี / home / user / public_html / และ /home/user/.git
Hayden Thring

ว้าวนั่นเป็นวิธีที่ง่ายและง่ายในการแก้ปัญหาของมัน (ไม่ใช่การสร้างบล็อกเซิร์ฟเวอร์แบบกว้างใน apache security.conf ยาก) สิ่งเดียวที่ต้องระวังคือถ้าโฮสติ้งของคุณมีการตั้งค่าความเป็นเจ้าของ / สิทธิ์แปลก ๆ บน publlic_html อาจมีการเปลี่ยนแปลง
Hayden Thring

1
จริงมาก ... ที่จริงผมมีคนอื่น "พี่น้องไดเรกทอรี" เพื่อวัตถุประสงค์อื่น ๆ ที่ยังคงไม่สามารถเข้าถึงได้จากเว็บที่ช่วยให้ฉันไปนอนหลับดีขึ้นเล็กน้อยในเวลากลางคืน :)
Javier Larroulet
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.