PDA

View Full Version : سوال: جلوگیری از باز کردن فایل های زیپ داخل فولدر با لینک مستقیم



ravand
سه شنبه 21 اردیبهشت 1395, 14:50 عصر
سلام
من یه سری فایل زیپ دارم داخل یک فولدر. میخوام کسی نتونه مستقیم این فایل های زیپ رو باز کنه و حتما با کلیک روی یه لینکی به صورت غیر مستقیم این فایل ها رو باز کنه. میخوام از htaccess کمک بگیرم . کسی میدونه چطوری میشه با htaccess این کار رو کرد؟
من خودم با php برنامه اش رو نوشتم که طرف با لینک غیر مستقیم فایل های زیپ رو باز کنه ولی میخوام از htaccess کمک بگیرم که کسی فایل زیپ رو مستقیم باز نکنه و حتما مجبور بشه از ادرس خاصی وارد بشه که این کدهای مربوط به htaccess رو بلد نیستم.
متشکرم.

plague
سه شنبه 21 اردیبهشت 1395, 18:24 عصر
<IfModule authz_core_module>
Require all denied
</IfModule>
<IfModule !authz_core_module>
Deny from all
</IfModule>

ravand
سه شنبه 21 اردیبهشت 1395, 18:34 عصر
<IfModule authz_core_module>
Require all denied
</IfModule>
<IfModule !authz_core_module>
Deny from all
</IfModule>

نه اشتباه میکنید. من میخوام یه لینک خاصی که لینک دهنده هست . بتونه فایل زیپ رو باز کنه. این دستورات کلاً هر چی لینک هست رو نمیذاره باز بشه.

plague
سه شنبه 21 اردیبهشت 1395, 19:32 عصر
شاید من درست متوجه نشدم چی میخاید
ولی مگه نممیخاید کسی مستقیم نتونه دانلود کنه و از طریق کد php فایل ها دانلود بشن ؟
این کد رو میزاری تو htaccess بعد یه کد force download با php مینویسی که فایل رو بخونه از دایکتوری و بده به کاربر

ravand
سه شنبه 21 اردیبهشت 1395, 19:46 عصر
ببینید. این آدرس وقتی باز میشه فایل زیپ به صورت غیر مستقیم دانلود میشه:

http://localhost/dn/file.php?id=2
این آدرس در فایل مثلا download.php لینک شده.
اسم پوشه ای که فایل های زیپ داخلش هست مثلا upload هست. میخوام فایل های زیپی که داخلش هست با لینک مستقیم دانلود نشه. و با htaccess دستوری بنویسم که طرف مجبور بشه حتما روی لینکی که داخل فایل download.php هست کلیک کنه تا فایل زیپ رو باز کنه. وگرنه فایل زیپ باز نشه.

Unique
سه شنبه 21 اردیبهشت 1395, 21:12 عصر
خوب plague هم همین را میگه دیگه ! دسترسی شما به پوشه upload از طریق php ربطی به تنظیمات htaccess نداره ،‌ htaccess از دسترسی به پوشه از طریق Apache ممانعت میکنه.

ravand
چهارشنبه 22 اردیبهشت 1395, 08:49 صبح
خوب plague هم همین را میگه دیگه ! دسترسی شما به پوشه upload از طریق php ربطی به تنظیمات htaccess نداره ،‌ htaccess از دسترسی به پوشه از طریق Apache ممانعت میکنه.
ببینید این دستوری که بهم دادن کاری میکنه که شما از هر ادرسی بخوای فایل زیپ رو باز کنی شدنی نیست . در صورتی که من میخوام از یه ادرس خاصی این فایل های زیپ درون پوشه رو باز کنم.
الان مثلا من این آدرس رو باز میکنم فایل زیپ دانلود میشه:

http://localhost/download/upload/219171.zip
ولی وقتی اون دستورات htaccess که بهم دادن استفاده کنم هیچ فایلی حتی از طریق آدرس دیگه باز نمیشه.
برای مثال من برای یکی از برنامه هایی که نوشته بودم. گفتم اگه لینک دهنده که ادرسش با این دستور گرفته میشه :

$_SERVER['HTTP_REFERER']
آدرس مثلا download.php باشه اجازه بده این کدها اجرا بشه.
برای این برنامه ای هم که میخوام بنویسم میخوام با htaccess یه همچین کاری انجام بدم. آیا شدنی هست؟

Unique
چهارشنبه 22 اردیبهشت 1395, 12:24 عصر
ببین راوند عزیز. فکر کن شما یک پوشه داری به نام uploads که توش فایل های zip را گذاشتی. شما با دستوراتی که plague داد مانع از درخواست دانلود یا بارگزاری فایل های این پوشه میشی. در واقع Apache وقتی درخواست url مرتبط با این پوشه میگیره مانع از دسترسی میشه.

حالا شما یک فایل download.php هم خارج از این پوشه upload یه جایی از سایت داری که مثلا با get کد دانلود 219171 را میگیره و بررسی میکنه کسی که فایل را خواسته میتون هبهش دسترسی پیدا کنه یا هر بررسی دیگه ای و اگه مجوز داشت میای و فایل را با header برای کاربر میفرستی ! توجه داشته باش که نباید کاربر را redirect کنی چون اگه redirect کنی آپاچی مانع ار دانلود میشه. شما باید به شکل زیر فایل را برای کاربر ارسال کنید.


$filepath = /path/to/219171.zip; // disk path not url
header('Content-Type: application/octet-stream');
header("Content-disposition: attachment; filename=\"" . basename($filepath) . "\"");
readfile($filepath);

استفاده از HTTP_REFERER هم درست نیست چون خیلی راحت میشه گولش زد !
در نهایت توجه کن که دسترسی php به صورت مستقیم از روی هاست هست و بدون واسطه آپاچی اما دسترسی کاربران دیگه از طریق آپاچی به فایل هست و آپاچی بر اساس دسترسی های محدود شده htaccess مانع از دانلود میشه.

باز هم اگه سوالی داری بپرس.

mrdollar
پنج شنبه 23 اردیبهشت 1395, 12:58 عصر
$filepath = /path/to/219171.zip; // disk path not url
header('Content-Type: application/octet-stream');
header("Content-disposition: attachment; filename=\"" . basename($filepath) . "\"");
readfile($filepath);

باز هم اگه سوالی داری بپرس.

سلام.

Unique عزیز ، من قبلا از این کدها استفاده کرده بودم و درست کار می کرد اما امروز متوجه شدم که متن فایل توی براوزر نشون داده می شه و پنجره دانلود فایل برای انتخاب مسیر و... ظاهر نمی شه!
اشکال از کجاست؟

Unique
پنج شنبه 23 اردیبهشت 1395, 15:30 عصر
شما دو تا کار انجام بدین :

اول این دو تا خط را بگذارین در ابتدای فایل (اگه فایلی جایی require میشه بگذارین توی فایلی که require میکنه):


error_reporting(E_ALL);
ini_set('display_errors','1');

میتونی هم این ها را بگذاری توی فایل htaccess. :

php_flag display_startup_errors on
php_flag display_errors on
php_value error_reporting 32767

بعدش یکبار چک کن و اگه خطایی میده همراه با کدت بگذار تا من و دوستان اگه نظری داریم بگیم.

mrdollar
شنبه 25 اردیبهشت 1395, 18:36 عصر
کد که همون کد بالاست...
اشکال از فایل php بود که utf8 ذخیره شده بود! 3 بایت به هدر این فایلها اضافه می شه! مواقعی که نباید کدی به هدر ارسال بشه (مثل دانلود یا ایجاد تصویر و...) مشکل ساز می شه!
راهی برای به هم نریختن متن فارسی بدون استفاده از کد اچ تی ام ال یا استفاده از انکدینگ utf8 نیست؟

Unique
شنبه 25 اردیبهشت 1395, 22:58 عصر
اشکال از فایل php بود که utf8 ذخیره شده بود!
بله وقتی شما خروجی بفرستی به مرورگر دیگه نمیتونی header ارسال کنی و خطای headers already sent میگیری !


راهی برای به هم نریختن متن فارسی بدون استفاده از کد اچ تی ام ال یا استفاده از انکدینگ utf8 نیست؟
ربطی به اینکه encoding فایل های php و html شما utf-8 باشه نداره و فایل های utf-8 هم نیاز به BOM ندارن و طبق بند 2.6 این سند (http://www.unicode.org/versions/Unicode5.0.0/ch02.pdf) اصلا نباید فایلهای utf-8 را براشون BOM گذاشت. BOM برای فایل های UTF-16 و ... اسفاده میشه که برنامه ای که فایل را میخونه بتونه از طریق Byte Order Mark تشخیص بده چطور فایل را بخونه. شما باید توی برنامه Editor تنظیم کنید که برای فایل utf-8 از گذاشتن BOM جلوگیری کنه. توجه کنید Unicode توی لینوکس utf-8 و توی ویندوز utf16-le هست. پس این موارد را قاطی نکنیم.

وقتی شما BOM بگذارین اول فایل PHP در واقع خروجی ارسال میشه و اجازه استفاده از header ندارین.