Hanya izinkan akses ke file dalam direktori dari situs web tempat mereka menjadi bagiannya

Mar 05 2020

Saya tahu ada banyak pertanyaan serupa di luar sana, dan saya telah mencari tahu semuanya, tetapi saya tidak bisa mendapatkan solusi apa pun untuk berhasil.

Saya memiliki folder di root situs web saya yang berisi file yang diunggah yang dapat dilihat dan diunduh dari situs ketika pengguna masuk. Mereka ada di sini: https://example.com/uploads(sebagai contoh). Saya membutuhkan situs tersebut untuk terus dapat mengaksesnya untuk menampilkannya (beberapa adalah gambar) dan menyediakan tautan untuk diunduh (pdf, dll.) Sehingga pengguna dapat mengunduhnya, tetapi saya ingin menghindari siapa pun yang memegang url dari sebuah file tertentu dapat mengunduhnya secara langsung, seperti ini:https://example.com/uploads/2020/02/myfile.pdf. ATAU url ini masuk ke mesin telusur (atau jika ya, server mencegahnya untuk diakses secara langsung.

Saya sudah mencoba menambahkan file .htaccess di direktori uploads dengan konten berikut:

Order Deny,Allow
Deny from all
Allow from 127.0.0.1

Dan saya sudah mencobanya

Order Allow,Deny
Deny from all
Allow from 127.0.0.1

... seperti yang saya baca bahwa mungkin memungkinkan panggilan HTTPS dari situs itu sendiri serta url lokal.

Tapi itu melarang situs dan permintaan url langsung, yang tidak baik.

Apakah ada cara untuk melakukan ini?

Jawaban

1 MrWhite Mar 06 2020 at 01:25

Antarmuka pengguna yang menyediakan akses 'resmi' ke file memiliki otentikasi pengguna, ya, tetapi file tersebut masih ada di direktori daripada tidak akan menghentikan siapa pun untuk mengaksesnya jika mereka mengetahui url.

Anda perlu melindungi file menggunakan sistem otentikasi yang sama yang Anda gunakan untuk melindungi akses ke antarmuka pengguna. Satu-satunya cara Anda dapat melindungi sumber daya ini dengan alamat IP (alamat IP klien ) - seperti yang saat ini Anda coba .htaccess- adalah jika IP klien telah diperbaiki dan diketahui sebelumnya (tetapi jika ini masalahnya maka Anda tidak memerlukan yang lain. bentuk otentikasi untuk memulai).

Jadi, ini terutama akan menjadi latihan dalam bahasa skrip / CMS apa pun yang digunakan untuk mengautentikasi "antarmuka pengguna".

Yang dapat Anda gunakan .htaccessadalah menulis ulang permintaan untuk file-file ini ke skrip sisi server Anda yang menangani otentikasi dan kemudian menyajikan file ke klien setelah diautentikasi.

Sebagai contoh:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^uploads/. /serve-protected-file.php [L]

Setiap permintaan untuk /uploads/<something>(. Misalnya /uploads/2020/02/myfile.pdf), bahwa peta ke file yang valid diarahkan ke script: /serve-protected-file.php.

/serve-protected-file.php kemudian perlu melakukan sesuatu seperti berikut:

// 1. Parse the file being requested from REQUEST_URI

// 2. Is the requested file "protected"?
//    (Serving both protected and public files from the same directory?)

// 3. If not protected then serve/stream the resource to the client. END

// 4. If protected then authenticate the user...

// 5. If user authenticated then serve/stream the resource to the client. END

// 6. Resource is protected and user not authenticated...
//    Serve a 403 Forbidden. END

(Idealnya, lokasi sumber daya yang "dilindungi" ini sepenuhnya berada di luar akar dokumen - jadi "pribadi" secara default - dan URL yang digunakan pengguna untuk mengakses sumber daya ini sepenuhnya virtual - Anda mungkin tidak memerlukannya pengkodean tambahan apa pun .htaccessdan semuanya akan diterapkan oleh pengontrol depan Anda - tetapi itu semua tergantung pada bagaimana situs Anda diimplementasikan dan cara URL dirutekan.)