مقاله

لینک دانلود امن فایل چگونه ساخته می‌شود؟ راهنمای تحویل زمان‌دار

لینک دانلود امن فایل چگونه ساخته می‌شود؟ راهنمای تحویل زمان‌دار

لینک دانلود امن فایل فقط یک نشانی طولانی و غیرقابل حدس نیست؛ این لینک باید در نقطه‌ای صادر شود که سرور، وضعیت سفارش و حق دسترسی کاربر را بررسی کرده باشد. سپس دسترسی باید برای فایل مشخص، عملیات مشخص و بازه زمانی مشخص صادر شود. اگر فایل در یک مسیر عمومی قرار گیرد، هرکس که نشانی را بداند یا آن را از کاربر دیگری دریافت کند، ممکن است بدون عبور از فرایند خرید به آن برسد.

در این مقاله، جریان پیشنهادی تحویل محتوای دیجیتال را از اعتبارسنجی سفارش تا ثبت رخداد و مدیریت خطای لینک منقضی بررسی می‌کنیم. مبنای بررسی منابع فنی این راهنما، صفحات رسمی و تخصصی مشاهده‌شده در ۸ اوت ۲۰۲۶ است.

لینک دانلود امن فایل چه تفاوتی با مسیر عمومی دارد؟

در روش ساده، فایل در نشانی قابل پیش‌بینی مانند /uploads/lesson-03.zip قرار می‌گیرد و صفحه خرید فقط همان نشانی را نشان می‌دهد. این کار دو مشکل دارد: مسیر عمومی فایل ممکن است در موتور جست‌وجو، تاریخچه مرورگر یا پیام‌های کاربران باقی بماند و هر کنترل دسترسی دیگری نیز ممکن است دور زده شود. تغییر نام فایل به یک رشته تصادفی هم به‌تنهایی مجوز دسترسی ایجاد نمی‌کند؛ چنان‌که راهنمای مجوزدهی OWASP تأکید می‌کند، پنهان‌کردن شناسه جایگزین کنترل دسترسی روی منبع نیست.

در مقابل، لینک امضاشده یا URL امضاشده معمولاً شامل شناسه منبع، عملیات مجاز، زمان ایجاد، زمان انقضا و امضای رمزنگاری‌شده است. سرویس ذخیره‌سازی یا دروازه دانلود، امضا را بررسی می‌کند و فقط در صورت معتبر بودن درخواست را می‌پذیرد. مستندات Amazon S3 و Google Cloud Storage هر دو URL امضاشده را روشی برای دسترسی محدود به منبع مشخص در بازه زمانی مشخص معرفی می‌کنند.

ویژگی مسیر عمومی URL امضاشده
صدور دسترسی اغلب با دانستن نشانی انجام می‌شود به امضا، عملیات و زمان وابسته است
انقضا معمولاً ندارد در زمان صدور تعیین می‌شود
محدودیت دانلود به‌سادگی قابل اعمال نیست با لایه صدور یا پروکسی قابل پیاده‌سازی است
حجم و فشار شبکه مستقیماً روی مسیر عمومی است می‌تواند پس از مجوز به ذخیره‌سازی خصوصی واگذار شود

نکته مهم این است که URL امضاشده یک رمز عبور دائمی نیست. این URL در عمل نوعی توکن حامل است: هرکس آن را در مدت اعتبار در اختیار داشته باشد، می‌تواند از همان مجوز استفاده کند. بنابراین URL امضاشده، احتمال دسترسی ناخواسته را کم می‌کند و پنجره سوءاستفاده را کوتاه می‌سازد، اما به‌تنهایی مانع اشتراک لینک نیست.

جریان درست کنترل دسترسی از سفارش تا دانلود

۱. نتیجه پرداخت را در سرور ثبت کنید

پس از بازگشت کاربر از پرداخت، وضعیت سفارش را فقط با داده‌ای که سرور اعتبارسنجی کرده تغییر دهید. صفحه مرورگر نباید بتواند با پارامتری مانند paid=1 مجوز دریافت بسازد. سرور باید شناسه سفارش، نتیجه تأیید، قلم خریداری‌شده و وضعیت قابل تحویل بودن آن را در پایگاه داده بررسی کند.

۲. مجوز محصول را از نشانی فایل جدا کنید

برای هر سفارش، یک رابطه روشن میان کاربر، سفارش، محصول دیجیتال و شیء ذخیره‌شده نگه دارید. کاربر بهتر است شناسه داخلی فایل را مستقیماً به‌عنوان مسیر ذخیره‌سازی کنترل نکند. اگر کاربر شناسه‌ای را تغییر دهد، سیستم باید دوباره بررسی کند که همین کاربر و همین سفارش حق دریافت همان منبع را دارند. OWASP توصیه می‌کند مجوز هر درخواست، برای منبع مشخص و در سمت سرور بررسی شود؛ کنترل سمت کاربر فقط برای تجربه کاربری است و نباید تصمیم نهایی دسترسی باشد.

۳. فایل اصلی را از فضای عمومی خارج کنید

فایل‌های قابل خرید را در bucket یا پوشه‌ای قرار دهید که دسترسی عمومی خواندن نداشته باشد. یک endpoint مانند /download می‌تواند درخواست را دریافت کند، وضعیت مجوز را بررسی کند و سپس یک URL امضاشده کوتاه‌عمر برای همان فایل صادر کند. در این الگو، سرور لازم نیست تمام بایت‌های فایل بزرگ را عبور دهد؛ می‌تواند پس از کنترل دسترسی، انتقال را به فضای ذخیره‌سازی خصوصی واگذار کند.

۴. در هر درخواست دوباره تصمیم بگیرید

اگر کاربر لینک صفحه دریافت را چند دقیقه بعد باز کرد، آن درخواست نیز باید بررسی شود. وجود یک نشست معتبر به معنی مجوز همه فایل‌ها نیست و موفق‌بودن درخواست قبلی نیز نباید مجوز همیشگی بسازد. راهنمای Authorization Cheat Sheet بر سیاست انکار پیش‌فرض، کنترل منابع ایستا و اعتبارسنجی مجوز در هر درخواست تأکید دارد.

انقضا، تعداد دریافت و محدودیت دستگاه

انقضای لینک دانلود باید با زمان لازم برای شروع و ادامه دریافت متناسب باشد. یک بازه بسیار کوتاه ممکن است برای فایل بزرگ خطای پشتیبانی بسازد و بازه بسیار طولانی پنجره اشتراک لینک را افزایش دهد. الگوی قابل مدیریت این است که حق دسترسی سفارش مدت طولانی‌تری داشته باشد، اما هر URL امضاشده فقط برای یک پنجره کوتاه صادر شود؛ کاربر مجاز بتواند در صورت انقضا، پس از احراز هویت و بررسی دوباره سفارش، URL تازه بگیرد.

عدد انقضا میان سرویس‌ها یکسان نیست. برای نمونه، مستندات فعلی AWS می‌گوید زمان URL ساخته‌شده با کنسول می‌تواند از یک دقیقه تا ۱۲ ساعت باشد و در CLI یا SDK تا هفت روز تنظیم شود؛ URLهای Google Cloud نیز حداکثر اعتبار هفت‌روزه را در فرایند V4 نشان می‌دهند. این اعداد را نباید قانون عمومی همه زیرساخت‌ها دانست؛ محدودیت ارائه‌دهنده و نوع اعتبارنامه صادرکننده باید در طراحی بررسی شود.

خود URL امضاشده الزاماً یک‌بارمصرف نیست. AWS تصریح می‌کند که URL امضاشده می‌تواند تا زمان انقضا چند بار استفاده شود. اگر سیاست شما محدودیت تعداد دانلود دارد، آن را در لایه کسب‌وکار پیاده کنید: برای هر مجوز، شمارنده، سقف مجاز، زمان آخرین دریافت و وضعیت لغو را ذخیره کنید. افزایش شمارنده باید اتمیک باشد تا دو درخواست هم‌زمان، سقف را ناخواسته دور نزنند.

در فایل‌های بزرگ، هر درخواست HTTP الزاماً یک دانلود کامل نیست؛ مرورگر یا دانلودمنیجر ممکن است برای ادامه انتقال چند درخواست بازه‌ای بفرستد. بنابراین پیش از شمارش، تعریف کنید که یک دانلود یعنی صدور لینک، شروع انتقال، یا تکمیل بخش عمده فایل. اگر هر درخواست را یک دانلود حساب کنید، قابلیت ادامه دریافت می‌تواند سهمیه کاربر را ناعادلانه مصرف کند.

محدودیت دستگاه نیز باید بر اساس شناسه‌ای باشد که سرور کنترل می‌کند، نه رشته‌ای که کاربر آزادانه در درخواست می‌فرستد. می‌توان یک نشست فعال یا دستگاه ثبت‌شده را به مجوز متصل کرد، اما این کنترل را مانع مطلق ندانید. امکان بازیابی حساب، تغییر دستگاه و خطای شناسایی باید در فرایند پشتیبانی پیش‌بینی شود؛ هدف، کاهش اشتراک‌گذاری گسترده است، نه تضمین فنی استفاده توسط یک انسان مشخص.

هدرهای امن و پشتیبانی از دانلودهای بزرگ

پس از صدور مجوز، پاسخ دانلود باید هدرهای مناسب داشته باشد. راهنمای هدرهای HTTP در OWASP برای فایل‌های قابل دریافت این موارد را پیشنهاد می‌کند:

  • Content-Disposition: attachment برای وادارکردن مرورگر به دریافت فایل به‌جای نمایش درون‌خطی.
  • Content-Type دقیق و متناسب با نوع فایل؛ برای نوع‌های ناشناخته یا باینری می‌توان از application/octet-stream استفاده کرد.
  • X-Content-Type-Options: nosniff برای جلوگیری از حدس‌زدن نوع MIME توسط مرورگر.
  • Cache-Control: no-store برای محتوای حساس، یا سیاستی متناسب با نیاز کش در صورتی که فایل واقعاً عمومی نیست.
  • Referrer-Policy: strict-origin-when-cross-origin در سطح سایت برای محدودکردن اطلاعات referrer ارسالی به مبدأهای دیگر.

در نام فایل، از مقدار کنترل‌شده استفاده کنید و مسیر یا کاراکترهای نامطمئن را وارد نام خروجی نکنید. طبق مستندات MDN درباره Content-Disposition، پارامتر attachment دانلود را پیشنهاد می‌کند و برای نام‌های فارسی می‌توان در کنار filename از filename* با کدگذاری UTF-8 استفاده کرد.

برای فایل‌های حجیم، پشتیبانی از درخواست‌های بازه‌ای اهمیت دارد. سربرگ Range به مشتری اجازه می‌دهد فقط بخش مشخصی از منبع را درخواست کند؛ پاسخ موفق این درخواست معمولاً با 206 Partial Content و توضیح محدوده در Content-Range برمی‌گردد. RFC 9110 این قابلیت را برای ادامه انتقال‌های قطع‌شده و دریافت بخشی از منابع بزرگ توضیح می‌دهد. صفحه MDN درباره Range نیز رفتار 206 و خطای 416 را شرح می‌دهد.

اعتبار URL باید برای هر درخواست بازه‌ای نیز معتبر باشد. AWS توضیح می‌دهد که اگر دریافت فایل بزرگ پیش از زمان انقضا آغاز شده باشد، همان انتقال می‌تواند ادامه پیدا کند؛ اما شروع مجدد پس از انقضا شکست می‌خورد. پس صفحه دریافت باید امکان صدور لینک تازه را پس از بررسی مجدد سفارش داشته باشد و کاربر را با خطای مبهم رها نکند.

ثبت رخداد و مدیریت لینک منقضی

ثبت رخداد، فقط برای یافتن متخلف نیست؛ برای تشخیص خطای واقعی کاربر و کاهش رفت‌وبرگشت پشتیبانی نیز لازم است. راهنمای ثبت رخداد OWASP پیشنهاد می‌کند هر رخداد دست‌کم مشخص کند چه زمانی، کجا، توسط چه کسی و درباره چه عملی رخ داده است. برای تحویل فایل، شناسه سفارش، شناسه منبع، شناسه نشست دریافت، زمان، نتیجه، کد HTTP، حجم منتقل‌شده و عامل کاربر می‌تواند مفید باشد.

از ثبت کامل URL امضاشده در لاگ، پیام خطا یا ابزار تحلیل خودداری کنید؛ چنین URLای تا زمان انقضا حامل مجوز است. به‌جای آن، شناسه داخلی نشست و خلاصه‌ای از علت شکست را ثبت کنید. لاگ‌ها نیز نباید در مسیر قابل دسترسی وب قرار گیرند و دسترسی به آن‌ها باید محدود و قابل پایش باشد.

برای خطای انقضا، پیام مشخصی مانند لینک منقضی شده است ارائه کنید و دکمه صدور مجدد را فقط پس از بازگشت به مسیر احراز هویت و کنترل سفارش فعال کنید. برای سفارش پرداخت‌نشده، لغوشده یا منبع حذف‌شده، پاسخ را طوری طراحی کنید که هم اطلاعات اضافی درباره وجود فایل فاش نشود و هم کاربر مسیر اصلاح، مانند بررسی وضعیت سفارش یا تماس با پشتیبانی، را بداند. شناسه پیگیری هر خطا، بررسی علت را برای تیم فنی آسان‌تر می‌کند.

سناریوی عملی برای یک فایل ۱٫۲ گیگابایتی

فرض کنید کاربر یک دوره ویدیویی را خریده است. پس از تأیید سمت سرور، رکوردی با وضعیت قابل تحویل ایجاد می‌شود. کاربر وارد صفحه دریافت می‌شود؛ سرور مالکیت سفارش را بررسی می‌کند، فایل را از روی شناسه داخلی پیدا می‌کند و URL امضاشده‌ای با اعتبار ۱۵ دقیقه صادر می‌کند. فایل اصلی همچنان خصوصی است و پاسخ ذخیره‌سازی با Content-Disposition: attachment، نوع محتوای درست و nosniff برمی‌گردد.

برای محدودیت سه دریافت، سیستم به‌جای شمردن کورکورانه درخواست‌های HTTP، یک نشست دانلود ایجاد می‌کند. درخواست نخست نشست را ثبت می‌کند و درخواست‌های Range همان نشست را به انتقال ادامه‌دار نسبت می‌دهد. سقف با تراکنش اتمیک کنترل می‌شود. اگر لینک در اختیار فرد دیگری قرار گیرد، تا پایان ۱۵ دقیقه قابل استفاده است؛ به همین دلیل عمر کوتاه، احراز هویت دوباره و امکان لغو مجوز باید در کنار هم دیده شوند. پس از ذخیره فایل روی دستگاه کاربر، هیچ روش فنی عمومی نمی‌تواند کپی‌برداری را به‌طور کامل منتفی کند.

چک‌لیست اجرایی پیاده‌سازی

  1. فایل‌های قابل خرید را از مسیر عمومی خارج و فضای ذخیره‌سازی را خصوصی کنید.
  2. وضعیت سفارش و حق دسترسی را فقط در سمت سرور تعیین کنید.
  3. برای هر درخواست، مجوز همان کاربر و همان منبع را دوباره بررسی کنید.
  4. URL امضاشده را برای فایل، عملیات و بازه زمانی مشخص صادر کنید.
  5. عمر لینک را کوتاه، اما امکان صدور مجدد برای خریدار مجاز را فراهم کنید.
  6. محدودیت تعداد دریافت را با شمارنده اتمیک و تعریف روشن از دانلود اجرا کنید.
  7. محدودیت نشست یا دستگاه را قابل بازیابی و قابل بررسی در پشتیبانی طراحی کنید.
  8. هدرهای Content-Disposition، Content-Type، nosniff و سیاست کش مناسب را تنظیم کنید.
  9. برای فایل‌های بزرگ، Range، ادامه انتقال و رفتار پس از انقضا را آزمایش کنید.
  10. موفقیت، شکست مجوز، انقضا، عبور از سقف و خطاهای زیرساختی را بدون ثبت خود توکن لاگ کنید.

نتیجه مطلوب، یک لینک جادویی و غیرقابل کپی نیست؛ بلکه زنجیره‌ای از کنترل‌هاست: فایل خصوصی، مجوز سمت سرور، URL کوتاه‌عمر، سهمیه روشن، لاگ قابل اتکا، هدر امن و مسیر بازیابی ساده. این ترکیب هم دسترسی غیرمجاز را محدود می‌کند و هم احتمال آن را کاهش می‌دهد که یک خطای کوچک در تحویل، تجربه کاربر را به پشتیبانی تکراری تبدیل کند.

منابع و مطالعه بیشتر