یک اسکریپت PHP بنویسید که ابتدا یک stream wrapper سفارشی را با stream_wrapper_unregister حذف کند، سپس محتوای یک فایل محلی را بخواند و با هدرهای مناسب (Content-Type، Content-Disposition و Content-Length) و با مدیریت بافر خروجی (ob_start/ob_end_flush) آن را برای دانلود به مرورگر ارسال کند.
15.0 بازدید آخرین ویرایش در 198 روز قبل ساعت 01:38 0.0
برای حل مسئله از توابع PHP مانند stream_get_wrappers برای بررسی وجود wrapper و stream_wrapper_unregister('scheme') برای حذف استفاده کنید، سپس فایل محلی را با file_get_contents یا readfile بخوانید؛ قبل از ارسال محتوا مطمئن شوید هیچ خروجی ای ارسال نشده تا هدرها قابل تنظیم باشند. از header() برای گذاشتن Content-Type و Content-Disposition و Content-Length استفاده کنید و با ob_start() و ob_end_flush() یا ob_clean()/flush() بافر خروجی را مدیریت کنید؛ نکات کاربردی: ابتدا وجود wrapper را چک کنید، در صورت نیاز از stream_wrapper_restore برای بازگردانی استفاده کنید، و بعد از ارسال محتوا اسکریپت را با exit خاتمه دهید تا خروجی ناخواسته ارسال نشود.
1 پاسخ
جدید ترین قدیمی ترین بالاترین امتیاز پاسخ های من
در حال بارگیری...
برای ارسال پاسخ باید با حساب کاربری وارد شوید.
ورود به حساب کاربری
قبل از فراخوانی stream_wrapper_unregister حتما با stream_get_wrappers بررسی کنید که wrapper وجود دارد و در صورت نیاز بعد از ارسال فایل آن را با stream_wrapper_restore بازگردانید. برای ارسال فایلهای حجیم از readfile یا fpassthru به جای file_get_contents استفاده کنید تا حافظه اشباع نشود و Content-Length را صحیح تنظیم کنید. اطمینان حاصل کنید هیچ خروجی (حتی BOM) قبل از ارسال هدرها صادر نشده و از ob_start() و ob_clean()/flush() یا ob_end_flush() برای کنترل بافر استفاده کنید. همچنین نام فایل ورودی را اعتبارسنجی و مسیرهای traversal را فیلتر کنید تا ریسکهای امنیتی کاهش یابد و در پایان اسکریپت با exit از ارسال خروجی اضافی جلوگیری کنید.
گزارش