نقطه پایانی
یک URL خاص که در آن میتوان به یک API یا سرویس دسترسی پیدا کرد تا عملی انجام شود یا دادهای بازیابی شود.
تعریف کوتاه
نقطه پایانی یک آدرس خاص (URL) است که میتوانید با یک API صحبت کنید. مثلاً /api/users نقطه پایانی برای دریافت کاربران است، /api/login برای ورود. هر نقطه پایانی یک کار خاص انجام میدهد.
تعریف کامل
نقطه پایانی یک مسیر URL خاص است که API عملکرد خود را از طریق آن ارائه میدهد. این نقطه اتصال بین کلاینت و سرور برای یک عملیات خاص است.
ساختار:
1Base URL + Path = Endpoint23https://api.example.com/v1/users/1234│ │ │5│ │ └─ مسیر نقطه پایانی6│ └─ نسخه API7└─ Base URL
مثال نقاط پایانی REST API:
1GET /api/users ← فهرست همه کاربران2GET /api/users/123 ← دریافت کاربر خاص3POST /api/users ← ایجاد کاربر جدید4PUT /api/users/123 ← بهروزرسانی کاربر5DELETE /api/users/123 ← حذف کاربر
انواع:
- عمومی: هر کسی میتواند دسترسی داشته باشد
- احراز هویت شده: نیاز به ورود/توکن دارد
- داخلی: فقط برای سرویسهای داخلی
- Webhook: اعلانها را دریافت میکند
چرا مهم است
- نقاط پایانی تعیین میکنند API شما چه کاری میتواند انجام دهد
- هر نقطه پایانی یک سطح حمله بالقوه است
- طراحی مناسب نقطه پایانی بر امنیت تأثیر میگذارد
- شمارش نقاط پایانی عملکرد را آشکار میکند
- کنترل دسترسی باید به ازای هر نقطه پایانی باشد
چگونه مهاجمان از آن استفاده میکنند
تکنیکهای حمله:
۱. شمارش نقاط پایانی: یافتن نقاط پایانی پنهان که در مستندات نیستند:
1/api/users ← عمومی2/api/users/admin ← پنهان؟3/api/internal/ ← داخلی؟4/api/v2/ ← نسخه منتشرنشده؟
ابزارها: ffuf، gobuster، Burp Intruder
۲. IDOR (مرجع مستقیم ناامن شی):
1GET /api/users/123 ← ID شما2GET /api/users/124 ← داده شخص دیگر
۳. SSRF از طریق نقطه پایانی:
1POST /api/webhook2{3 "url": "http://169.254.169.254/metadata"4}
۴. تخصیص انبوه:
1POST /api/users2{3 "username": "attacker",4 "password": "pass",5 "role": "admin" ← نباید مجاز باشد6}
۵. بهرهبرداری از نسخه:
1/api/v1/users ← وصله شده2/api/v0/users ← نسخه قدیمی و آسیبپذیر هنوز فعال است
چگونه تشخیص یا پیشگیری کنیم
پیشگیری:
طراحی:
- استفاده از نسخهبندی (/v1/, /v2/)
- قراردادهای نامگذاری یکسان
- مستندات واضح
- غیرفعال کردن نقاط پایانی استفادهنشده
- حذف نقاط پایانی دیباگ/تست در تولید
امنیت:
- احراز هویت در همه نقاط پایانی
- بررسی مجوز (نه فقط احراز هویت)
- محدودیت نرخ به ازای هر نقطه پایانی
- اعتبارسنجی ورودی
- غیرفعال کردن متدهای HTTP غیرضروری (مثلاً DELETE اگر فقط خواندنی است)
نمونه کد:
1@app.route('/api/users/<int:user_id>', methods=['GET'])2@require_authentication3def get_user(user_id):4 # بررسی مجوز5 if current_user.id != user_id and not current_user.is_admin:6 return {"error": "Unauthorized"}, 40378 # دسترسی تأیید شده9 user = User.query.get(user_id)10 return jsonify(user)
تشخیص:
- ثبت تمام دسترسیها به نقاط پایانی
- نظارت بر الگوهای شمارش:
- تلاشهای متوالی ID
- خطاهای ۴۰۴ ناشی از اسکن
- درخواست به نقاط پایانی مستندنشده
- هشدار در مورد دسترسی به نقاط پایانی حساس
- ردیابی متدهای HTTP غیرعادی (OPTIONS، TRACE)
باورهای غلط رایج
- "احراز هویت از همه نقاط پایانی محافظت میکند" - نیاز به مجوز هم هست
- "نقاط پایانی پنهان امن هستند" - امنیت از طریق ابهام شکست میخورد
- "مستندات بیش از حد فاش میکند" - مهاجمان به هر حال شمارش میکنند
- "نقاط پایانی میتوانند احراز هویت مشترک داشته باشند" - هر کدام نیاز به بررسی خود دارند
- "نقاط پایانی GET فقط خواندنی هستند" - برخی به اشتباه وضعیت را تغییر میدهند
مثال واقعی
API Informed Delivery USPS (۲۰۱۸)
آسیبپذیری:
1GET /account/profile?userId=12345
مشکل: عدم بررسی مجوز
حمله: ۱. ایجاد حساب (دریافت userId=12345) ۲. امتحان userId=12346، 12347 و غیره ۳. دسترسی به ۶۰ میلیون حساب کاربری
نتیجه: نام کامل، آدرس، ایمیل، شماره تلفن افشا شد.
API Peloton (۲۰۲۱)
نقطه پایانی داده زیادی افشا کرد:
1GET /api/user/{user_id}/profile
برگرداند:
- اطلاعات خصوصی پروفایل
- تاریخچه تمرین
- داده موقعیت مکانی
- حتی برای حسابهای "خصوصی"
میتوانست با تکرار user_id همه کاربران را شمارش کند.
API Venmo
نقطه پایانی عمومی بدون احراز هویت:
1GET /api/transactions
افشا کرد:
- تمام تراکنشهای عمومی
- روابط کاربران
- الگوهای مالی
- میتوانست میلیونها تراکنش را استخراج کند
اصطلاحات مرتبط
API, URL, HTTP Request, REST, Authentication