ปฏิเสธการเข้าถึงโฟลเดอร์และไฟล์โดยตรงโดย htaccess


135

นี่คือสถานการณ์:

  • มีindex.phpไฟล์อยู่ในโฟลเดอร์รูท
  • ไฟล์บางไฟล์จะรวมindex.phpอยู่ในincludesโฟลเดอร์
  • อีก 1 ไฟล์ ( submit.php) อยู่ในโฟลเดอร์รูทสำหรับการดำเนินการส่งแบบฟอร์ม

ฉันต้องการ จำกัด การเข้าถึงของผู้ใช้โดยตรงไปยังไฟล์ในincludesโฟลเดอร์โดย htaccess สำหรับsubmit.php. แต่รวมจะใช้ได้กับindex.phpไฟล์ เช่นเดียวกับหากผู้ใช้พิมพ์www.domain.com/includes/somepage.phpก็จะ จำกัด (อาจถูกเปลี่ยนเส้นทางไปยังหน้าแสดงข้อผิดพลาด)

คำตอบ:


269

ฉันจะย้ายincludesโฟลเดอร์ออกจากเว็บรูท แต่ถ้าคุณต้องการบล็อกการเข้าถึงโดยตรงไปยังincludesโฟลเดอร์ทั้งหมดคุณสามารถใส่.htaccessไฟล์ในโฟลเดอร์นั้นที่มีเพียง:

deny from all

ด้วยวิธีนี้คุณไม่สามารถเปิดไฟล์ใด ๆ จากโฟลเดอร์นั้น แต่คุณสามารถรวมไว้ใน php ได้โดยไม่มีปัญหาใด ๆ


7
ไฟล์อื่นจะสามารถร้องขอ ajax ไปยังไฟล์ที่อยู่ในโฟลเดอร์นั้นได้หรือไม่?
Chaitanya Chandurkar

16
@ChaitanyaChandurkar ไม่คำขอ ajax เป็นคำขอ http ปกติดังนั้นจะถูกปฏิเสธ
jeroen

Sr b / c ฉันเขียนโปรแกรมเว็บใหม่ ฉันจะเพิ่มข้อยกเว้นสำหรับการเข้าถึงไฟล์ index.php ได้อย่างไร?
PhatHV

ฉันใช้ปฏิเสธจากทั้งหมดและมัน จำกัด ทุก url .. ไม่แม้แต่จะแสดงหน้าล็อกอิน .. :(
Aamir

@Aamir ถูกต้องไม่มี url ในโฟลเดอร์นั้นที่จะเข้าถึงได้ แต่คุณสามารถรวมไว้ในไฟล์อื่น ๆ ได้โดยไม่มีปัญหา
jeroen

56

นี่เป็นmod_rewriteวิธีแก้ปัญหาที่บริสุทธิ์:

RewriteRule ^(includes/|submit\.php) - [F,L,NC]

สิ่งนี้จะแสดงข้อผิดพลาดที่ต้องห้ามที่จะใช้หาก URI มีอย่างใดอย่างหนึ่ง/includes/หรือ/submit.php


3
ทำได้ดีมากในการส่งไฟล์
CTS_AE

30

เป็นไปได้ที่จะใช้คำสั่งไฟล์และไม่อนุญาตให้เข้าถึงไฟล์ทั้งหมดจากนั้นใช้อีกครั้งเพื่อตั้งค่าไฟล์ที่สามารถเข้าถึงได้:

<Files ~ "^.*">
  Deny from all
</Files>

<Files ~ "^index\.php|css|js|.*\.png|.*\.jpg|.*\.gif">
  Allow from all
</Files>

7
ฉันไม่แน่ใจเกี่ยวกับคนที่โพสต์คำถามว่าปัญหาของเขาแก้ไขได้หรือไม่ แต่นี่คือความสวยงามของ SO ที่คำตอบหลาย ๆ คำตอบสามารถช่วยสมาชิกจำนวนมากได้ คำตอบสุดท้ายนี้ช่วยแก้ปัญหาของฉันได้ ฉันต้องการให้ไซต์รับไฟล์ css แต่ไม่สามารถเข้าถึงฟอนต์ ttf หรือ otf และบูม! แก้ไขแล้ว
Moxet Khan

หลังจากนี้ฉันไม่สามารถเข้าถึงไฟล์ในโฟลเดอร์ย่อยได้
Gintare Statkute

14

1 ซับ mod_alias ตามโซลูชัน:

RedirectMatch 403 ^/folder/file.php$

สิ่งนี้จะแสดงข้อผิดพลาดที่ต้องห้ามสำหรับ /folder/file.php


1
1 - นี้เป็นจริงที่ดีมากเพราะไม่มีใครยังสามารถดูไฟล์ที่มีอยู่ถ้าคุณใช้404ไปยังโฟลเดอร์ทั้งหมดโดยใช้ ^folderregex
bytecode77

9

ถ้าฉันเข้าใจถูกต้องคุณแค่ต้องการปฏิเสธการเข้าถึงโฟลเดอร์รวม?

. htaccess ที่มีคำสั่ง 'DENY FROM ALL' ที่อยู่ในโฟลเดอร์รวมจะทำเคล็ดลับ


8

Q ของคุณแบ่งออกเป็นสองส่วนทั้งโซลูชันของ jeroen และ anubhava ทำงานสำหรับส่วนที่ I - ปฏิเสธการเข้าถึง / รวม anubhava ยังใช้งานได้กับส่วนที่ II ฉันชอบอย่างหลังเพราะฉันใช้DOCROOT/.htaccessอยู่แล้วและสิ่งนี้ทำให้การควบคุมดังกล่าวทั้งหมดอยู่ในไฟล์เดียว

อย่างไรก็ตามสิ่งที่ฉันไม่ต้องการพูดคุยคือแนวคิดของ "การปฏิเสธการเข้าถึงsubmit.php" ถ้าคุณไม่ต้องการใช้submit.phpแล้วทำไมต้องมีใน DOCROOT เลย? ฉันสงสัยว่าคำตอบที่นี่คือคุณใช้เป็นเป้าหมายการดำเนินการในบางรูปแบบและต้องการให้ยิงเมื่อส่งแบบฟอร์มเท่านั้นไม่ใช่โดยตรงเช่นจากสแปมบอท

หากเป็นจริงคุณจะไม่สามารถใช้ส่วน II ของ anubhava ได้เนื่องจากจะทำให้แบบฟอร์มของคุณล้มเหลว สิ่งที่คุณทำได้คือ (i) ด้วยการ.htaccessตรวจสอบเพื่อให้แน่ใจว่าผู้อ้างอิงคือหน้าดัชนีของคุณเอง:

RewriteCond %{HTTP_REFERRER} !=HTTP://www.domain.com/index.php   [NC]
RewriteRule ^submit\.php$    -                                   [F]

และ (ii) ภายในตัวสร้างฟอร์ม PHP index.php ของคุณมีฟิลด์ที่ซ่อนอยู่สำหรับการประทับเวลาและการตรวจสอบความถูกต้อง การตรวจสอบความถูกต้องอาจเป็นอักขระ 10 ตัวแรกของ MD5 ของการประทับเวลาและความลับภายใน ในการประมวลผลการส่งคุณสามารถ (i) ตรวจสอบความถูกต้องว่าการประทับเวลาและการตรวจสอบความถูกต้องตรงกันและ (ii) การประทับเวลาอยู่ภายใน 15 นาทีของเวลาปัจจุบัน

วิธีนี้คุณสามารถป้องกันการส่งสแปมได้เป็นวิธีเดียวที่ผู้ส่งสแปมสามารถรับคู่การประทับเวลา / การตรวจสอบความถูกต้องได้คือการแยกวิเคราะห์แบบฟอร์ม แต่การขูดนี้จะมีอายุเพียง 15 นาที


6

ขึ้นอยู่กับตัวเลือกอื่น ๆ ที่เป็นไปได้ซึ่งตั้งค่าในระดับที่สูงขึ้นคุณอาจต้องใส่สิ่งต่อไปนี้ในไฟล์. htaccess ในไดเร็กทอรี include ของคุณ:

Satisfy all
Order deny,allow
Deny from all

ฉันพบสิ่งนี้เมื่อไดเร็กทอรีด้านบนกำหนดการรับรองความถูกต้องพื้นฐานรวมถึงบรรทัด:

Satisfy any

นี่เป็นการป้องกันไม่ให้การปฏิเสธของฉันทั้งหมดมีผลเนื่องจากผู้ใช้ได้รับการรับรองความถูกต้อง


1

คุณสามารถเพิ่มคำสั่งด้านล่างลงใน.htaccessไฟล์

Deny from all
ErrorDocument 403 "nothing is here"

จะแสดงข้อความ "ไม่มีอะไรอยู่ที่นี่" ในกรณีที่มีการเข้าถึงโดยไม่ได้รับอนุญาต

หากคุณต้องการเปลี่ยนเส้นทางโดยรหัสข้อผิดพลาดไปยังหน้าใดหน้าหนึ่งคุณสามารถกำหนดคำสั่งได้ดังนี้:

ErrorDocument 404 "/errors/404.html"

มันจะเปลี่ยนเส้นทางไปยัง/errors/404.htmlและแสดงหน้าจอที่กำหนดเองไม่พบหน้าจอ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.