วิธีปฏิเสธการเข้าถึงไฟล์ใน. htaccess


112

ฉันมีไฟล์. htaccess ต่อไปนี้:

RewriteEngine On
RewriteBase /

# Protect the htaccess file
<Files .htaccess>
Order Allow,Deny
Deny from all
</Files>

# Protect log.txt
<Files ./inscription/log.txt>
Order Allow,Deny
Deny from all
</Files>

# Disable directory browsing
Options All -Indexes

ฉันพยายามห้ามไม่ให้ผู้เยี่ยมชมเข้าถึงไฟล์ต่อไปนี้:

domain.com/inscription/log.txt

แต่สิ่งที่ฉันมีข้างต้นใช้ไม่ได้: ฉันยังสามารถเข้าถึงไฟล์จากเบราว์เซอร์จากระยะไกลได้

คำตอบ:


187

ภายในไฟล์ htaccess ขอบเขตของ<Files>คำสั่งจะใช้กับไดเร็กทอรีนั้นเท่านั้น (ฉันเดาว่าเพื่อหลีกเลี่ยงความสับสนเมื่อกฎ / คำสั่งใน htaccess ของไดเร็กทอรีย่อยถูกนำไปใช้โดยนำมาใช้แทนพาเรนต์)

ดังนั้นคุณสามารถมี:

<Files "log.txt">  
  Order Allow,Deny
  Deny from all
</Files>

สำหรับ Apache 2.4+ คุณจะใช้:

<Files "log.txt">  
  Require all denied
</Files>

ในไฟล์ htaccess ในinscriptionไดเร็กทอรีของคุณ หรือคุณสามารถใช้ mod_rewrite เพื่อจัดการทั้งสองกรณีปฏิเสธการเข้าถึงไฟล์ htaccess เช่นเดียวกับ log.txt:

RewriteRule /?\.htaccess$ - [F,L]

RewriteRule ^/?inscription/log\.txt$ - [F,L]

ถ้าคุณใช้ IIS ให้ทำในไฟล์ web.config แทน
Shaun Luttin

1
การใช้กฎการเขียนซ้ำจะปฏิเสธรหัสของฉันเองจากการเข้าถึงเนื้อหาของ * .txt คุณจะแก้ไขปัญหานี้อย่างไร?
Pantss

8
"ขอบเขตของ<Files>คำสั่งใช้กับไดเร็กทอรีนั้นเท่านั้น" - ไม่ ใช้กับไดเร็กทอรีนั้นและไดเร็กทอรีย่อยทั้งหมดที่อยู่ด้านล่าง จึง<Files "log.txt">จะจับ/log.txt และ /inscription/log.txt .
MrWhite

1
คุณสามารถอัปเดตคำตอบนี้ได้Order Allow,Denyหรือไม่เนื่องจากเลิกใช้งานใน 2.4
Telarian

18

การจับคู่รูปแบบที่ชัดเจน - นี่คือวิธีที่ฉันใช้ที่นี่ที่ Perishable Press ด้วยการใช้การจับคู่รูปแบบที่ชัดเจนเทคนิคนี้จะป้องกันการเข้าถึงไฟล์จากภายนอกที่มี“ .hta ”,“ .HTA ” หรือชุดค่าผสมที่ไม่คำนึงถึงขนาดตัวพิมพ์ เพื่อเป็นตัวอย่างรหัสนี้จะป้องกันการเข้าถึงผ่านคำขอใด ๆ ต่อไปนี้:

  • .htaccess
  • .htaccess
  • .htaccess
  • testFILE.htaccess
  • filename.HTACCESS
  • FILEROOT.hTaCcEsS

.. ฯลฯ เห็นได้ชัดว่าวิธีนี้มีประสิทธิภาพสูงในการรักษาความปลอดภัยไฟล์ HTAccess ในไซต์ของคุณ นอกจากนี้เทคนิคนี้ยังรวมถึงคำสั่ง“ สนองความต้องการทั้งหมด ” ที่เสริมสร้าง โปรดทราบว่าควรใส่รหัสนี้ในไฟล์ HTAccess รูทของโดเมนของคุณ:

# STRONG HTACCESS PROTECTION
<Files ~ "^.*\.([Hh][Tt][Aa])">
order allow,deny
deny from all
satisfy all
</Files>

1
ฉันได้รับข้อผิดพลาด 500 เซิร์ฟเวอร์ภายในเมื่อใช้รหัสนี้ คิดว่าทำไม? ฉันใช้ Wordpress
Keryn Gill

8
มันสมเหตุสมผลกว่าไหมที่จะไม่อนุญาตให้ผู้ใช้เข้าถึง dotfiles? <Files ~"^\..*">ใช้สิ่งที่ต้องการ
Steen Schütt

1
ต้องการช่องว่างระหว่างเครื่องหมายทิลเดอร์และเครื่องหมายอัญประกาศ - อย่างน้อยสำหรับฉันฉันต้องการมัน ~ SPACE "
Art Geigel

ฉันได้รับพฤติกรรมเดียวกันกับการปิดใช้. file: <filesMatch "^ \ .. *"> order allow, ปฏิเสธการปฏิเสธจากทั้งหมด </FilesMatch>
Pinon Nirvana

14

ฉันไม่เชื่อว่าคำตอบที่ยอมรับในปัจจุบันนั้นถูกต้อง ตัวอย่างเช่นฉันมี.htaccessไฟล์ต่อไปนี้ในรูทของเซิร์ฟเวอร์เสมือน (apache 2.4):

<Files "reminder.php">
require all denied
require host localhost
require ip 127.0.0.1
require ip xxx.yyy.zzz.aaa
</Files>

สิ่งนี้ป้องกันการเข้าถึงภายนอกreminder.phpซึ่งอยู่ในไดเร็กทอรีย่อย ฉันมี.htaccessไฟล์ที่คล้ายกันบนเซิร์ฟเวอร์ Apache 2.2 ที่มีเอฟเฟกต์เดียวกัน:

<Files "reminder.php">
        Order Deny,Allow
        Deny from all
        Allow from localhost
        Allow from 127.0.0.1
     Allow from xxx.yyy.zzz.aaa
</Files>

ผมไม่ทราบว่า แต่ผมสงสัยว่ามันเป็นความพยายามที่จะกำหนดไดเรกทอรีย่อยเฉพาะใน.htaccessไฟล์ได้แก่ <Files ./inscription/log.txt>ซึ่งเป็นสาเหตุของมันที่จะล้มเหลว มันจะง่ายกว่าถ้าใส่.htaccessไฟล์ในไดเร็กทอรีเดียวกันกับlog.txtie ในinscriptionไดเร็กทอรีและมันจะทำงานที่นั่น


1
คุณได้รับการโหวตเพิ่มขึ้นซึ่งใช้ได้กับ apache 2.4 ของฉันด้วย
Tschallacka

3

วางบรรทัดด้านล่างในไฟล์. htaccess ของคุณและแทนที่ชื่อไฟล์ตามที่คุณต้องการ

RewriteRule ^(test\.php) - [F,L,NC]

-4

คุณสามารถใช้<Directory>แท็กเช่น:

<Directory /inscription>
  <Files log.txt>
    Order allow,deny
    Deny from all
  </Files>
</Directory>

อย่าใช้./เพราะหากคุณใช้เพียงแค่/ดูไดเรกทอรีรากของไซต์ของคุณ

ดูตัวอย่างโดยละเอียดเพิ่มเติมได้ที่http://httpd.apache.org/docs/2.2/sections.html


2
แต่ภาชนะที่ไม่ได้รับอนุญาตใน<Directory> .htaccessใน.htaccessที่.htaccessไฟล์ตัวเองคือ " ไดเรกทอรีภาชนะ" (ต่อไดเรกทอรีไฟล์ config)
MrWhite

ถ้าอย่างนั้นคุณสามารถใช้การเปลี่ยนเส้นทาง Redirect /inscription/log.txt access_denied.htmlสิ่งนี้จะเปลี่ยนเส้นทางผู้ใช้access_denied.htmlหากผู้ใช้ไปinscription/log.txtที่ไดเร็กทอรีจารึก
Nicholas English
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.