یک اسکریپت 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 خاتمه دهید تا خروجی ناخواسته ارسال نشود.

توسط پژوهشگر در 198 روز قبل ساعت 01:38
دسته بندی ها: PHP PHP for beginner
arash در 198 روز قبل ساعت 01:39

قبل از فراخوانی 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 از ارسال خروجی اضافی جلوگیری کنید.

گزارش

1 پاسخ

جدید ترین قدیمی ترین بالاترین امتیاز پاسخ های من

در حال بارگیری...
ورود به حساب کاربری