403، نه 401 است و نه 404
401 Unauthorized یعنی سرور اعتبارنامه میخواهد، یا آنچه فرستادید پذیرفته نشده. فرستادن اعتبارنامهٔ معتبر پاسخ را تغییر میدهد.
403 Forbidden یعنی اعتبارنامه موضوع نیست. درخواست فهمیده شد و رد شد. وارد شدن شاید کمکی نکند، چون هر چیزی که شما را رد کرده شاید برایش مهم نباشد شما که هستید.
404 گاهی عمداً بهجای 403 استفاده میشود تا تأیید نشود که مسیری وجود دارد. اگر برای یک آدرس یکسان در یک محیط دنبال 403 میگردید و در محیطی دیگر 404 میبینید، این تفاوت یک انتخاب پیکربندی است، نه یک باگ.
لایهٔ 1 — origin شما آن را رد کرد
سادهترین حالت. فایل وجود دارد اما وبسرور آن را سرویس نمیدهد: مجوزهای دایرکتوری که کاربر وب را کنار میگذارند، دایرکتوریای بدون فایل index که فهرستکردن هم در آن غیرفعال است، یک قانون deny در .htaccess یا nginx، یا اپلیکیشنی که یک نقش را بررسی میکند و خودش 403 برمیگرداند.
چگونه تشخیصش دهیم. صفحهٔ خطا شبیه استک شماست: یک صفحهٔ پیشفرض Apache یا nginx، یا صفحهٔ استایلدارِ «دسترسی ندارید» خودِ اپلیکیشن شما. لاگ دسترسی origin شما درخواست را با وضعیت 403 ثبت کرده — و همین نشانه است، چون اصلاً درخواست به origin رسیده.
لایهٔ 2 — یک قانون WAF مطابقت پیدا کرد
یک فایروال اپلیکیشن وب (WAF) درخواست را بازرسی میکند و وقتی با یک signature حمله مطابقت پیدا کند، آن را مسدود میکند. این همان لایهای است که آن 403های گیجکننده را تولید میکند، چون درخواست از نگاه کسی که آن را فرستاده کاملاً بیگناه به نظر میرسد.
false positiveهای معمول عجیبوغریب نیستند: ویرایشگر یک CMS که یک پست حاوی کلمهٔ SELECT در یک نمونهکد را ذخیره میکند، یک فیلد فرم که تکهای HTML در خود دارد، توضیح یک محصول که یک آپاستروف در جای خاصی دارد. rule setهایی که همراه یک WAF میآیند برای گرفتن تلاشهای injection نوشته شدهاند، و متن انسانی گاهی شبیه آنها به نظر میرسد.
در cdn.com.tr، WAF همان ModSecurity بههمراه OWASP Core Rule Set است، و یک درخواست مسدودشده یک صفحهٔ 403 اختصاصی همراه با یک reference ID دریافت میکند. آن شناسه کل نکته است: شناسهٔ همان درخواست است که در لاگ ممیزی نوشته شده، پس میتوانید دقیقاً پیدا کنید کدام قانون و روی کدام فیلد مطابقت داشته، بهجای حدسزدن. صفحهٔ لاگ WAF در پنل، رویدادهای مسدودشده را همراه با دستهٔ حمله، کشور، IP و قانونی که فعال شده فهرست میکند.
راهحلی که محافظت را حفظ میکند. همان فیلد مشخص را روی همان مسیر مشخص معاف کنید — برای مثال بدنهٔ پست را روی آدرس ویرایشگر — بهجای غیرفعالکردن یک خانوادهٔ کامل از قواعد در همهجا یا خاموشکردن WAF برای کل سایت. یک استثنای باریک هیچ هزینهای برای شما ندارد؛ یک استثنای گسترده بیسروصدا محافظت را از همهٔ صفحات دیگر برمیدارد.
لایهٔ 3 — مسدودسازی کشوری یا شبکهای
مسدودسازیهای جغرافیایی و شبکهای پیش از آنکه درخواست به اپلیکیشن شما برسد اعمال میشوند، و آنها هم 403 تولید میکنند. اگر یک لیست سیاه کشوری دارید، همهٔ افراد از آن کشور رد شدن را میبینند. اگر بر اساس ASN مسدود کنید — یک autonomous system number که کل شبکهٔ یک ارائهدهنده را پوشش میدهد — همهٔ بازدیدکنندگان روی آن ارائهدهنده رد میشوند، که دامی بهمراتب گستردهتر از آن چیزی است که به نظر میرسد.
تلهای که ارزش دانستن دارد. اپراتورهای موبایل میلیونها مشترک عادی را پشت تعداد انگشتشماری ASN قرار میدهند، و IPهای موبایل هم میچرخند. بازدیدکنندهای که روی وایفای مشکلی نداشت میتواند روی دیتای موبایل رد شود و آن را اینطور توصیف کند: «سایت روی گوشیام خراب است». اگر گزارشهای 403 شما روی شبکههای موبایل خوشهبندی شدهاند، پیش از آنکه به اپلیکیشنتان نگاه کنید به مسدودسازیهایتان نگاه کنید.
مسدودسازیهایی مثل این ارزش ممیزیکردن برنامهریزیشده را دارند. قانونی که در طول یک حادثه اضافه شده معمولاً از خودِ حادثه بیشتر عمر میکند.
لایهٔ 4 — محافظت هاتلینک و لیستهای IP
محافظت هاتلینک درخواستهای تصاویر و فایلهای شما را وقتی هدر Referer سایتی دیگر باشد رد میکند. کارش را درست انجام میدهد، اما ترافیک مشروعی را هم که فراموشش کردهاید رد میکند: دامنهٔ staging خودتان، یک کلاینت ایمیل که یک تصویر را رندر میکند، اپلیکیشنی که اصلاً referer نمیفرستد. علامتش خاص و قابلتشخیص است — صفحات بالا میآیند، تصاویر نه.
لیستهای مجاز و مسدود IP خشنترین لایهاند. یک لیست مجاز روی یک مسیر مدیریتی یک کنترل عالی است، تا روزی که IP دفترتان تغییر کند و هیچکس یادش نباشد چنین لیستی اصلاً وجود دارد. وقتی یک 403 دقیقاً یک نفر را تحتتأثیر قرار میدهد و هیچکس دیگر را نه، معمولاً همین دلیل است.
چگونه علت را بهترتیب پیدا کنیم
از بیرون به درون کار کنید. چند دقیقه طول میکشد و از حدسزدن بهتر است.
1. صفحهٔ خطا را بخوانید. یک صفحهٔ اختصاصی با یک reference ID یعنی یک تصمیم در edge — یک قانون WAF، یک مسدودسازی جغرافیایی یا ASN. یک صفحهٔ پیشفرض سرور یا استایل خودِ اپلیکیشنتان یعنی origin تصمیم گرفته.
2. اگر یک reference ID هست، آن را جستوجو کنید. لاگ WAF شناسهٔ قانون، فیلد مطابقتیافته و مقداری که آن را فعال کرده را به شما میدهد. این سریعترین مسیر از علامت به علت است، و گفتوگو را از «سایت گاهی من را مسدود میکند» به «قانون 942100 با بدنهٔ پست مطابقت داشت» تغییر میدهد.
3. بررسی کنید که آیا فقط شما هستید. از یک شبکهٔ دیگر یا یک اتصال موبایل امتحان کنید. اگر فقط شما هستید، به لیستهای IP نگاه کنید. اگر همهٔ افراد یک کشور هستند، به مسدودسازیهای جغرافیاییتان نگاه کنید.
4. بررسی کنید که آیا فقط یک مسیر است. یک آدرس که رد میشود درحالیکه بقیهٔ سایت کار میکند، به قواعد خودِ origin یا یک قانون WAF که به آن مسیر مقید شده اشاره دارد.
5. تنها در این مرحله به origin نگاه کنید. اگر درخواست هرگز در لاگ دسترسی origin شما ظاهر نمیشود، پیش از رسیدن به آنجا رد شده، و هیچ تغییری که روی origin بدهید کمکی نمیکند.
رفعش کنیم بدون از دستدادن محافظت
غریزهٔ اول وقتی یک WAF یک درخواست مشروع را مسدود میکند این است که WAF را برای آن سایت خاموش کنیم. این کار جواب میدهد، به این معنا که علامت ناپدید میشود، و محافظت را از هر درخواست دیگری که به آن فکر نمیکردید هم برمیدارد.
ترتیب بهتر: مسدودشدن را بازتولید کنید، شناسهٔ قانون را از لاگ بخوانید، یک استثنا برای آن قانون روی آن فیلد و آن مسیر بنویسید، سپس دوباره بازتولید کنید تا مطمئن شوید درخواست عبور میکند و قانون هنوز جاهای دیگر فعال میشود. در cdn.com.tr دقیقاً کار قانونهای تحویل (delivery rules) و پریستهای امنیتی همین است — استثنا در پیکربندی زندگی میکند، روی هر edge مستقر میشود، و در تاریخچهٔ فعالیت همراه با فردی که آن را ایجاد کرده و مقادیر پیش و پس از آن قابلمشاهده است.
اگر نمیتوانید مسدودشدن را بازتولید کنید، شروع به نوشتن استثنا نکنید. استثنا برای قانونی که علت نبوده، محافظتی است که بیجهت برداشته شده.
پرسشهای پرتکرار
چرا یک آدرس یکسان در یک مرورگر کار میکند و در مرورگری دیگر نه؟
درخواست یکسان نیست. user agentهای متفاوت، کوکیهای متفاوت، و بهخصوص شبکههای متفاوت — یک مرورگر روی وایفای و یکی روی دیتای موبایل از آدرسهای IP متفاوتی خارج میشوند. اگر رد شدن بهجای مرورگر از شبکه پیروی میکند، بهجای اپلیکیشنتان به مسدودسازیهای IP، کشور یا ASN نگاه کنید.
WAF من ویرایشگر خودم را وقتی یک پست را ذخیره میکنم مسدود میکند. چه چیزی را تغییر دهم؟
شناسهٔ قانون را از رویداد مسدودشده پیدا کنید، سپس آن قانون را برای فیلدی که ویرایشگر روی آدرس ویرایشگر میفرستد معاف کنید. کل مسیر را معاف نکنید و خانوادهٔ قانون را برای کل سایت غیرفعال نکنید: همان قواعد بقیهٔ فرمهای شما را هم محافظت میکنند، و تلاشهای injection از همان فیلدهایی میرسند که متن مشروع میرسد.
آیا یک 403 میتواند cache شود؟
میتواند، و یک 403 که cache شده یک غافلگیری ناخوشایند است چون علت ناپدید میشود درحالیکه علامت میماند. پاسخهای خطا عموماً باید با یک TTL کوتاه سرویس داده شوند یا اصلاً cache نشوند. اگر علت را رفع کردهاید و بازدیدکنندگان هنوز رد شدن را میبینند، پیش از ادامهٔ دیباگ، مسیر را purge کنید.
reference ID روی صفحهٔ خطا — برای چیست؟
این شناسهٔ همان درخواست دقیق در لاگ ممیزی است. یک بازدیدکننده میتواند آن را برای شما بفرستد و شما میتوانید پیدا کنید کدام قانون، روی کدام فیلد و با کدام مقدار فعال شده. بدون آن، یک گزارش «گاهی 403 میگیرم» تقریباً غیرقابلبررسی است.
آیا یک 403 به SEO من آسیب میزند؟
یک 403 روی صفحهای که میخواهید ایندکس شود، بله آسیب میزند، چون خزنده هم مثل هر کلاینت دیگری رد میشود و در نهایت آدرس را کنار میگذارد. موردی که باید مراقبش باشید یک مسدودسازی بیشازحد گسترده است که خزندههای موتور جستوجو را هم میگیرد — بررسی کنید صفحاتی که برایتان مهماند به یک خزنده هم 200 پاسخ میدهند، نه فقط به مرورگرتان.