Faragiri

همهٔ زبان‌ها

آموزش REST API وردپرس وردپرس

رابط برنامه‌نویسی وردپرس از روز اول روشن است و بخشی از آن بدون ورود جواب می‌دهد. دانستن کدام بخش، اولین کار است.

۴بخش
۳دقیقه خواندن
۵عمق

یک نصب تازه

چه چیزی بدون ورود جواب می‌دهد و چه چیزی نه

هر بله پایین یعنی این مسیر به کاربر واردنشده جواب می‌دهد. سطر نامعلوم به افزونه‌های شما بستگی دارد.

  1. بلهفهرست نوشته‌هاعمومی، و همان چیزی که در خود سایت هم دیده می‌شودبله
  2. بلهفهرست کاربرانعمومی، با نام و نام کاربری نویسنده‌هابله
  3. خیرانواع محتواعمومی، و ساختار سایت را نشان می‌دهدخیر
  4. خیرتنظیمات سایتبسته، و پاسخ عدم احراز می‌دهدخیر
  5. بررسی نشدهمسیرهای افزونه‌هابه تابع مجوز هر افزونه بستگی دارد و کسی نگاهش نکردهبررسی نشده

حالت سوم دلیل وجود این فهرست است. سطر آخر روی هر نصبی متفاوت است و تنها راه دانستنش شمردن مسیرها و خواندن تابع مجوز هرکدام است.

هر نصب وردپرس یک رابط برنامه‌نویسی روشن دارد و لازم نیست کاری بکنید. روی همین نصب، با وردپرس 7.1 و سیزده افزونه فعال، در تاریخ ۲۰۲۶-۰۹-۰۳ شمرده شد که ۲۱۴ مسیر ثبت شده است، از هسته و از افزونه‌ها.

و همه‌شان یک سطح دسترسی ندارند. بدون هیچ ورودی، از همین نصب:

  • فهرست نوشته‌ها پاسخ موفق می‌دهد
  • فهرست کاربران هم پاسخ موفق می‌دهد
  • تنظیمات سایت پاسخ عدم احراز می‌دهد

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

افزودن مسیر خودتان

ثبت یک مسیر تازه سه چیز می‌خواهد: فضای نام، الگوی مسیر، و یک تابع مجوز. سومی اختیاری به نظر می‌رسد و نیست: مسیری که تابع مجوزش همیشه درست برگرداند، عملا عمومی است، و همین رایج‌ترین اشتباه افزونه‌نویس‌هاست.

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

فضای نام هم باید مال خودتان باشد و نه فضای هسته، چون هسته اجازه دارد هر وقت بخواهد مسیرهای خودش را عوض کند.

احراز هویت، و انتخابی که ساده نیست

از داخل خود سایت، کوکی به‌همراه نانس کافی است. از بیرون، رمز کاربردی ساده‌ترین راه است و روی اتصال رمزنشده نباید استفاده شود، چون در هر درخواست فرستاده می‌شود.

و اگر مصرف‌کننده یک برنامه سمت مرورگر روی دامنه دیگری است، مسئله اشتراک منابع بین‌دامنه‌ای هم اضافه می‌شود که تنظیم جدایی دارد. مرزهایش در منبع، فعل، و کد وضعیت است.

جایی که کار گیر می‌کند، بستن کامل رابط است

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

ابزار، و سالی که این حرف درست است

در سال ۲۰۲۶، خود WP-CLI دستوری دارد که همه مسیرهای ثبت‌شده را فهرست می‌کند و رایگان است؛ همان است که عدد بالا با آن گرفته شد و جای باز کردن نشانی رابط در مرورگر را می‌گیرد، که فقط ریشه را نشان می‌دهد. رمزهای کاربردی از سال ۲۰۲۰ در هسته هستند و جای افزونه‌های احراز هویت جانبی را گرفته‌اند.

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

کنار این

بالای این