یک اشتباه به ظاهر ساده در API نویسی که میتواند دسترسی ادمین را دودستی تقدیم هکر کند!
(تله Over-Posting)
خیلی از ما وقتی توی داتنت شروع به ساخت Controller و Endpointهای API میکنیم، برای راحتی کار یا سرعت بیشتر، یک اشتباه کلاسیک انجام میدیم:
ارسال مستقیم Entityهای دیتابیس به ورودی متدها!
[HttpPost]
public async Task<IActionResult> UpdateUser(User user) //
تله بزرگ!
شاید ظاهر قضیه این باشه که Model Binder خودش دادهها رو مپ میکنه و همهچیز سریع کار میکنه، اما پشت صحنه چه اتفاقی میافته؟
خطر Over-Posting (یا Mass Assignment):
کافیه کلاینت (از طریق Postman یا ابزارهای مشابه) فیلدهایی مثل IsAdmin = true یا WalletBalance رو توی بدنه درخواست JSON بفرسته؛ از اونجا که فریمورک بدون تفکیک، مقادیر رو Bind میکنه، دیتای حساس بدون اعتبارسنجی آپدیت میشه!
اصول طلایی یک API تمیز و امن:
همیشه از DTO (Data Transfer Object) استفاده کنیم: فقط فیلدهایی که کاربر مجاز به ارسال یا دریافت اونهاست در قالب کلاسهای سبک تعریف بشن.
قرارداد شفاف (Contract): کلاینت نباید از ساختار جداول دیتابیس و Relationها باخبر بشه؛ API فقط یک پل ارتباطی سبک، مستقل و Stateless است.
اعتبارسنجی دقیق ورودیها (Validation): هیچ دادهای از دنیای بیرون نباید بدون فیلتر وارد لایههای زیرین بشه.
@DevTwitter | <Ehsan Faramarzi/>
Post #13267
5.82K

- 👍 26
- ❤ 8
- 🍌 6