Amirali Yaghoutiمهندس ارشد نرم‌افزار

مطالعه موردی مهندسی

فایروال فهرست مجاز Searchwiz

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

مسئله تجاری

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

آنچه تحویل دادم

  • a2-searchwiz-cart-block.php، یک افزونه‌ی MU که فقط روی درخواست‌های رسیده از IPهای شریک اعمال می‌شود و برای بقیه کاملاً بی‌اثر است.
  • یک فهرست رد قاطع که قبل از هر قانون اجازه ارزیابی می‌شود و /cart، /checkout و /my-account را به همراه زیرمسیرهایشان پوشش می‌دهد.
  • قوانین رد برای سطوح AJAX معادل، چون بلاک‌کردن تنها مسیر صفحه، اکشن‌های wc-ajax و admin-ajax را قابل‌دسترس باقی می‌گذارد.
  • یک اجازه‌ی صریح برای namespace REST خود شریک، که همان مسیری است که یکپارچه‌سازی قرار است از آن استفاده کند.
  • یک بلاک بی‌قیدوشرط روی wp-admin، wp-login.php و xmlrpc.php برای این IPها، صرف‌نظر از هر چیز دیگر.
  • یک دنباله‌ی رد-پیش‌فرض: GET و HEAD برای خزش عادی مجازند و هرچه به انتهای قوانین برسد رد می‌شود.
  • یک کلید خاموشی مستند در فایل فلگ‌های زمان اجرا، تا بشود موقتاً در جریان یک بازبینی به مهندسان شریک دسترسی کامل داد بدون دست‌زدن به فایروال.

رویکرد فنی

  • قوانین رد قبل از قوانین اجازه اجرا می‌شوند. ترتیب برعکس همان چیزی است که در اجازه‌لیست‌ها سوراخ ایجاد می‌کند، چون یک اجازه‌ی عمومی که بعداً نوشته شده بی‌صدا مسیری را که قبلاً کسی بسته بود دوباره باز می‌کند.
  • تطبیق مسیر پیشوندآگاه و لنگرانداخته است، پس /cart با /cart و /cart/هرچیزی تطبیق می‌کند ولی نه با مسیری که صرفاً آن کلمه را در خودش دارد.
  • فهرست IPهای مجاز یک آپشن است که با آدرس‌های مستند خزنده‌ی شریک ادغام می‌شود، یعنی بدون دیپلوی قابل به‌روزرسانی است.
  • بلاک‌ها ۴۰۳ با هدرهای کش سرکوب‌شده برمی‌گردانند، تا یک رد هیچ‌وقت ذخیره و توسط لایه‌ی کش بازپخش نشود.
  • کلید خاموشی یک ثابت در فایل فلگ‌های زمان اجراست با کامنتی که می‌گوید باید برگردانده شود، چون یک bypass موقت بدون یادداشت تبدیل به دائمی می‌شود.

نتیجه و شواهد

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

اهمیت برای کارفرما

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

خلاصه-اجرایی-پروژه

خلاصه اجرایی خوانا

خلاصه_اجرایی {
  پروژه: "Searchwiz Allowlist Firewall"
  فایل: "mu-plugins/a2-searchwiz-cart-block.php (v1.1.0)"
  دامنه: "فقط درخواست‌های IPهای شریک؛ در غیر این صورت بی‌اثر"
  ترتیب: "رد قاطع ← اجازه‌ی صریح ← رد پیش‌فرض"
  رد_شده: "/cart /checkout /my-account (+زیرمسیرها)،
           اکشن‌های wc-ajax و admin-ajax متناظر،
           /wp-admin /wp-login.php /xmlrpc.php"
  مجاز: "namespace REST شریک؛ خزش GET/HEAD"
  پاسخ: "۴۰۳ با هدر nocache، هرگز کش نمی‌شود"
  کلید_خاموشی: "فلگ در 000-a2-runtime-flags.php، مستند"
}

ارزش حرفه‌ای این پروژه

ترتیب قوانین محتوای امنیتی این پروژه است. رد-قبل-از-اجازه با یک دنباله‌ی رد-پیش‌فرض تنها ساختاری است که وقتی کسی که اول آنجا نبوده قانون اضافه می‌کند درست باقی می‌ماند.

کلید خاموشی آنجاست چون جایگزینش را دیده‌ام: یک مهندس یک لایه‌ی امنیتی کامل را برای یک تست خاموش می‌کند و همان‌طور خاموش می‌ماند. یک فلگ نام‌دار با کامنت سخت‌تر فراموش می‌شود.