#P1558
GET /api/v2/tasks/list
Route Info
| Method | Endpoint | Controller | Middleware |
| GET | /api/v2/tasks/list | OfficialController@listTasks | authWithJwt |
منطق دقیق عملکرد (Code Logic)
این اندپوینت متد استاتیک getTasks را فراخوانی میکند. منطق پردازش دادهها به شرح زیر است:
- آمادهسازی کوئری:
- جدول
tasks_itemsباtasks_categoriesجوین (Left Join) میشود تا نام دستهبندی و مالک آن استخراج شود. - فیلتر دستهبندی: اگر پارامتر
categoryارسال شده باشد، شرطwhere('tasks_items.category', ...)اعمال میشود. - فیلتر مالکیت (باگ منطقی): کد تلاش میکند بر اساس پارامتر
goal(که مقدار 'own' ارسال شده) فیلتر کند. اما شرط اعمال فیلتر، وجود متغیرoperator$است. از آنجا که در فراخوانی این متد، شناسه اپراتور پاس داده نشده است، هیچ فیلتری روی مالکیت اعمال نمیشود و تمام تسکها واکشی میشوند. - فیلتر وضعیت: به صورت پیشفرض تسکهای با وضعیت
1(فعال) و3(احتمالا در حال انجام) برگردانده میشوند.
- جدول
- مرتبسازی: نتایج بر اساس
orderو سپسidمرتب میشوند. - پردازش نتایج (Loop): روی نتایج حلقه زده میشود و برای هر آیتم:
- اطلاعات کاربر سازنده از طریق
StaticController::getOperatorsواکشی میشود. - اطلاعات اتصال (Connection) از طریق
OfficialController::getConnectionواکشی میشود. - لیست اپراتورهای تخصیص داده شده مجدداً از طریق
StaticController::getOperatorsواکشی میشود.
- اطلاعات کاربر سازنده از طریق
پارامترهای ورودی (Query Params)
- category (اختیاری): شناسه دستهبندی جهت فیلتر کردن تسکها.
خروجیها
موفق (200 OK):
{
"status": true,
"time": 1732047000,
"data": [
{
"id": 105,
"user": { ... }, // آبجکت اطلاعات کاربر سازنده
"category": {
"id": 12,
"title": "General Tasks"
},
"title": "Fix Bugs",
"connection": false, // یا آبجکت کانکشن
"priority": 1,
"order": 0,
"description": "Details here...",
"deadline": "2025-01-01",
"operators": [ ... ], // آرایه اطلاعات اپراتورهای درگیر
"status": 1,
"created": "2024-12-01 10:00:00"
}
]
}
تحلیل ریسک و امنیت (Critical)
- نشت اطلاعات (Critical Security Bug): در متد
listTasks، تابعgetTasksبه صورتgetTasks('own', $cat)فراخوانی میشود. آرگومان سوم (`operator$`) ارسال نمیشود و مقدار پیشفرضfalseمیگیرد. در کدgetTasks، بلوک فیلتر کردن (`if ($operator)`) اجرا نمیشود. نتیجه این است که پارامتر'own'بی اثر شده و کاربر میتواند تمام تسکهای سیستم (حتی تسکهای دیگران) را ببیند. - مشکل N+1 Query: در حلقه
foreachخروجی، سه تابعgetOperators(دوبار) وgetConnectionبرای هر رکورد اجرا میشوند. اگر ۵۰ تسک وجود داشته باشد، حدود ۱۵۱ کوئری به دیتابیس زده میشود که پرفورمنس را نابود میکند. - SQL Injection احتمالی: استفاده از
whereRawبا قرار دادن مستقیم متغیر `$operator` در رشته کوئری (`JSON_CONTAINS(..., '\"$operator\"')`) ناامن است و باید از Binding استفاده شود.