diff --git a/docs/security-before-production.md b/docs/security-before-production.md index c99c38c..255bf8f 100644 --- a/docs/security-before-production.md +++ b/docs/security-before-production.md @@ -347,3 +347,14 @@ | `INTERNAL_SERVICE_KEY` در هیچ حالتی پیش‌فرض ندارد | `payment/tests.py` (`test_debug_mode_has_no_default_internal_key`) | | کلیدِ امضای خودساخته (`.django_secret_key`) یک بار و اتمی ساخته می‌شود؛ سه workerِ هم‌زمان یک کلید دارند | دستی: سه پروسه‌ی هم‌زمان که `config.settings` را import می‌کنند، بی‌فایلِ کلید؛ ۲۰ از ۲۰ یک کلید | | فرانت: شماره‌ی سفارشِ برگشتی از درگاه فقط عدد است، مسیرها encode می‌شوند و «پرداخت موفق» فقط از پاسخِ سرور می‌آید؛ دو تبِ هم‌زمان با تمدیدِ توکن خارج نمی‌شوند | مخزنِ فرانت: `src/app/launchParams.ts`، `src/api/http.ts` | +| سفارش و تراکنش در پنل کاملاً فقط‌خواندنی‌اند (کارمندِ لغو/بازپرداخت مبلغ یا اعتبارِ سفارش را عوض نمی‌کند) و از پنل ساخته نمی‌شوند | `payment/tests_security_review.py` (`OrderAdminMoneyFieldsReadOnlyTests`) | +| ردِ بازار توکنِ خرید را نمی‌سوزاند؛ سفارشِ بازپرداخت‌شده توکنِ تازه نمی‌پذیرد | `payment/tests_security_review.py` (`BazaarRejectedVerifyDoesNotBurnTokenTests`) | +| کدِ تخفیفِ وسطِ رفتن به درگاه، مبلغِ authority را با سفارش ناهمخوان نمی‌کند | `payment/tests_security_review.py` (`DiscountDuringPaymentRequestTests`) | +| پرداختِ بسته‌ای که پلنش پاک شده از عددهای ثبت‌شده‌ی سفارش اعتبار می‌دهد (و اگر نداشت ERROR لاگ می‌شود)؛ پلن فقط با IRT ذخیره می‌شود | `subscription/tests_security_review.py` (`PaidPackWithDeletedPlanTests`، `PlanCurrencyIsTomanOnlyTests`) | +| توکنِ بازار (`refresh_token`، `pending_state`) با فیلترِ querystringِ پنل حرف‌به‌حرف درنمی‌آید | `payment/tests_security_review.py` (`BazaarTokenNotGuessableByAdminFilterTests`) | +| `device_id` با فیلترِ querystringِ پنل برای غیرِ ابرکاربر درنمی‌آید؛ شماره و `is_guest` را فقط ابرکاربر عوض می‌کند؛ حساب‌های کارمند و گروه‌ها فقط با ابرکاربر ساخته/تغییر می‌کنند | `accounts/tests_security_review.py` (`DeviceIdNotGuessableByAdminFilterTests`، `StaffCannotSwapLoginPhoneTests`، `StaffAccountsAdminSuperuserOnlyTests`) | +| لاگِ تحویلِ کمپین اجازه‌ی view می‌خواهد (هر کارمندی نمی‌بیند) | `campaigns/tests_security_review.py` | +| هر رقمِ یونیکد (تمام‌عرض، ریاضی…) در شماره به لاتین برمی‌گردد؛ کدِ غیرِ ASCII، `deviceId` null، پایه‌ی ناموجود یا عظیم و تاریخِ تولدِ با «²» ۴۰۰ است نه ۵۰۰؛ صافیِ نامِ نمایشی ارقامِ یونیکد و جداکننده‌ی دلخواه را می‌گیرد | `accounts/tests_security_review.py` (`UnicodeInputsAreNormalisedOrRejectedTests`) | +| مهمانِ نمایشیِ مشترک با ورودِ یک شماره به آن شماره تبدیل نمی‌شود | `accounts/tests_security_review.py` (`DemoGuestNotUpgradableTests`) | +| `/api/home?gradeId=` ناموجود کش نمی‌شود (کشِ پُر شمارنده‌ی سقفِ ورودِ ادمین را پاک می‌کرد)؛ `/api/progress/nodes` یک کوئری است و `unit` عظیم ۴۰۰ | `content/tests_security_review.py` (`JunkGradeIdsDoNotFlushCacheTests`، `ProgressNodesInputAndQueriesTests`) | +