امنیت وب برای توسعه‌دهندگان: ۱۰ اشتباه رایج که باید از آن‌ها اجتناب کنید
ﺯﻣﺎﻥ ﻣﻄﺎﻟﻌﻪ: 15 دقیقه

امنیت وب برای توسعه‌دهندگان: ۱۰ اشتباه رایج که باید از آن‌ها اجتناب کنید

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

در این مطلب، ۱۰ اشتباه رایج را بررسی می‌کنیم که معمولا در پروژه‌های وب دیده می‌شوند و می‌توانند امنیت یک سیستم را به‌طور جدی تهدید کنند. هدف این است که با شناخت این خطاها و راهکارهای جلوگیری از آن‌ها، بتوانید در پروژه‌های بعدی‌اتان تصمیم‌های آگاهانه‌تر و امن‌تری بگیرید.

۱) اعتبارسنجی ناکافی ورودی‌ها

ورودی‌های کاربر یکی از اصلی‌ترین نقاط تماس با سیستم هستند و اگر به‌درستی کنترل نشوند، می‌توانند به مسیر مستقیم اجرای کدهای مخرب تبدیل شوند. حملاتی مانند XSS و SQL Injection دقیقا از همین نقطه شروع می‌شوند، جایی که سیستم فرض می‌کند ورودی «درست» است و آن را بدون بررسی وارد پردازش می‌کند.

چرا این اشتباه خطرناک است

  • مهاجم می‌تواند کد دلخواه خود را در مرورگر کاربر اجرا کند.
  • امکان دستکاری کوئری‌ها و استخراج داده‌های حساس وجود دارد.
  • حتی یک فرم ساده تماس می‌تواند به نقطه نفوذ تبدیل شود.

مثال کوتاه

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

بهترین روش‌ها

  • استفاده از اعتبارسنجی سمت سرور (نه فقط سمت کلاینت)
  • محدودسازی نوع، طول و الگوی ورودی‌ها
  • استفاده از کتابخانه‌های معتبر برای Sanitization
  • جلوگیری از اجرای مستقیم ورودی در هر نوع پردازش حساس

اعتبارسنجی باید بخشی از طراحی اولیه باشد، نه یک مرحله اضافه‌شده در انتهای کار. هر ورودی، حتی اگر از یک سیستم داخلی دریافت شود، باید «غیرقابل‌اعتماد» در نظر گرفته شود.

 

۲) ذخیره‌سازی نامناسب رمز عبور

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

چرا این اشتباه خطرناک است

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

مثال کوتاه

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

بهترین روش‌ها

  • استفاده از الگوریتم‌های استاندارد و مقاوم در برابر حملات، مانند bcrypt یا Argon2
  • تعیین هزینه محاسباتی مناسب برای افزایش زمان پردازش و کاهش سرعت حملات
  • جلوگیری از ذخیره‌سازی هرگونه رمز عبور در قالب متن ساده، حتی در محیط‌های داخلی

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

 

۳) مدیریت نادرست سشن و توکن

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

چرا این اشتباه خطرناک است

  • مهاجم می‌تواند با سرقت یا حدس‌زدن توکن، به حساب کاربر وارد شود.
  • سشن‌های بدون انقضا یا با تنظیمات نامناسب، امکان سوءاستفاده طولانی‌مدت را فراهم می‌کنند.
  • استفاده از کوکی‌های ناامن، احتمال افشای اطلاعات در شبکه‌های ناامن را افزایش می‌دهد.

مثال کوتاه

در صورتی که کوکی سشن بدون ویژگی‌های امنیتی مانند HttpOnly یا Secure تنظیم شده باشد، یک اسکریپت مخرب در مرورگر کاربر می‌تواند مقدار آن را استخراج کند. این مقدار برای مهاجم کافی است تا بدون نیاز به رمز عبور، وارد حساب کاربر شود.

بهترین روش‌ها

  • فعال‌سازی ویژگی‌های امنیتی کوکی‌ها مانند HttpOnly ،Secure و SameSite
  • تعیین زمان انقضای مناسب برای سشن‌ها و توکن‌ها
  • استفاده از توکن‌های تصادفی با کیفیت بالا و غیرقابل پیش‌بینی
  • ابطال سشن‌ها پس از خروج کاربر یا تغییرات حساس در حساب

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

 

۴) عدم استفاده از HTTPS در تمامی مسیرها

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

چرا این اشتباه خطرناک است

  • داده‌های کاربر در مسیر انتقال قابل مشاهده و دستکاری می‌شوند.
  • مهاجمان می‌توانند حملات مرد میانی را به‌سادگی اجرا کنند.
  • حتی یک مسیر کوچک بدون HTTPS می‌تواند نقطه ورود به بخش‌های حساس باشد.
  • مرورگرها امروزه به‌طور پیش‌فرض به سایت‌های فاقد HTTPS هشدار امنیتی نمایش می‌دهند.

مثال کوتاه

فرض کنید صفحه ورود با HTTPS ارائه می‌شود، اما صفحه بازیابی رمز عبور همچنان از HTTP استفاده می‌کند. مهاجم می‌تواند با شنود ترافیک این مسیر، توکن بازیابی رمز عبور را استخراج کرده و بدون نیاز به رمز اصلی، وارد حساب کاربر شود.

بهترین روش‌ها

  • فعال‌سازی HTTPS برای تمامی مسیرها، بدون استثنا
  • استفاده از HSTS برای جلوگیری از هرگونه اتصال ناامن
  • هدایت خودکار تمام درخواست‌های HTTP به HTTPS
  • استفاده از گواهی‌های معتبر و به‌روزرسانی منظم آن‌ها

امنیت انتقال داده باید در همان مراحل اولیه طراحی سامانه در نظر گرفته شود. استفاده از HTTPS تنها یک لایه محافظتی نیست، پایه‌ای است که سایر سازوکارهای امنیتی بر آن استوار می‌شوند.

 

۵) مدیریت نادرست خطاها و لاگ‌ها

نحوه مدیریت خطاها و ثبت رویدادها یکی از بخش‌های کمتر مورد توجه در توسعه وب است، اما تاثیر آن بر امنیت سامانه بسیار جدی است. خطاهایی که به‌صورت خام و بدون کنترل به کاربر نمایش داده می‌شوند، می‌توانند اطلاعات ارزشمندی دربارهٔ ساختار داخلی سیستم، مسیرها، نسخه کتابخانه‌ها یا حتی کوئری‌های دیتابیس در اختیار مهاجم قرار دهند. از سوی دیگر، ثبت‌نکردن لاگ‌های کافی نیز باعث می‌شود تشخیص و تحلیل رخدادهای امنیتی دشوار یا حتی غیرممکن شود.

چرا این اشتباه خطرناک است

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

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

بهترین روش‌ها

  • نمایش پیام‌های خطای عمومی به کاربر و ثبت جزئیات کامل در لاگ‌های داخلی
  • جلوگیری از ثبت داده‌های حساس در لاگ‌ها
  • تعیین سطح‌بندی مناسب برای لاگ‌ها (مانند Info ،Warning ،Error)
  • استفاده از ابزارهای متمرکز برای جمع‌آوری و تحلیل لاگ‌ها

مدیریت خطا و لاگ باید بخشی از معماری امنیتی سامانه باشد. هدف این است که اطلاعات کافی برای تحلیل رخدادها ثبت شود، بدون آنکه داده‌های حساس در معرض افشا قرار گیرد.

 

۶) پیکربندی نادرست CORS

سیاست اشتراک‌گذاری منابع بین مبداها (CORS) یکی از سازوکارهای مهم امنیتی در مرورگرها است که تعیین می‌کند کدام دامنه‌ها اجازه دسترسی به منابع یک سامانه را دارند. پیکربندی نادرست این سیاست می‌تواند به مهاجمان اجازه دهد درخواست‌هایی را از دامنه‌های غیرمجاز ارسال کنند و به داده‌هایی دسترسی یابند که نباید در اختیار آن‌ها قرار گیرد. این اشتباه معمولا زمانی رخ می‌دهد که توسعه‌دهندگان برای رفع سریع یک مشکل، محدودیت‌ها را بیش از حد باز می‌گذارند.

چرا این اشتباه خطرناک است

  • امکان ارسال درخواست‌های غیرمجاز از دامنه‌های ناشناس فراهم می‌شود.
  • مهاجمان می‌توانند از طریق یک وب‌سایت ثالث، به داده‌های کاربر در سامانه اصلی دسترسی پیدا کنند.
  • پیکربندی بیش‌ازحد باز، عملا CORS را بی‌اثر می‌کند و سطح حمله را افزایش می‌دهد.

مثال کوتاه

اگر مقدار Access-Control-Allow-Origin به‌صورت * تنظیم شود، هر دامنه‌ای می‌تواند به منابع سامانه دسترسی پیدا کند. این موضوع در ترکیب با درخواست‌های احراز هویت‌شده، می‌تواند به افشای داده‌های حساس منجر شود.

بهترین روش‌ها

  • تعیین دقیق دامنه‌های مجاز به‌جای استفاده از مقادیر عمومی
  • محدودسازی روش‌ها و هدرهای مجاز
  • جلوگیری از فعال‌سازی اشتباه اعتبارسنجی کوکی‌ها در کنار Originهای گسترده
  • بررسی و تست پیکربندی CORS در محیط‌های مختلف

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

 

۷) نادیده‌گرفتن به‌روزرسانی‌های امنیتی

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

چرا این اشتباه خطرناک است

  • مهاجمان اغلب از آسیب‌پذیری‌های شناخته‌شده استفاده می‌کنند، نه روش‌های پیچیده.
  • نسخه‌های قدیمی کتابخانه‌ها ممکن است شامل نقص‌هایی باشند که به‌سادگی قابل بهره‌برداری هستند.
  • به‌روزرسانی‌نکردن وابستگی‌ها می‌تواند امنیت کل زنجیره نرم‌افزار را تضعیف کند.
  • تأخیر در نصب وصله‌های امنیتی، زمان کافی برای سوءاستفادهٔ مهاجمان فراهم می‌کند.

در بسیاری از رخنه‌های امنیتی مشهور، مهاجمان از آسیب‌پذیری‌هایی استفاده کرده‌اند که ماه‌ها قبل وصله رسمی آن‌ها منتشر شده بود. تنها دلیل موفقیت حمله، نصب‌نشدن به‌روزرسانی‌ها در زمان مناسب بوده است.

بهترین روش‌ها

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

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

 

۸) استفاده از کتابخانه‌ها و پکیج‌های بدون بررسی

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

چرا این اشتباه خطرناک است

  • پکیج‌های آلوده می‌توانند کد مخرب را در زمان اجرا وارد سامانه کنند.
  • وابستگی‌های قدیمی یا رهاشده ممکن است شامل آسیب‌پذیری‌های جدی باشند.
  • مهاجمان گاهی پکیج‌هایی با نام مشابه پکیج‌های معتبر منتشر می‌کنند تا توسعه‌دهندگان را فریب دهند.
  • استفاده از پکیج‌های غیرقابل‌اعتماد، امنیت کل زنجیرهٔ تأمین نرم‌افزار را تضعیف می‌کند.

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

بهترین روش‌ها

  • بررسی اعتبار پکیج از نظر تعداد دانلود، نگهداری فعال و سابقه توسعه‌دهندگان
  • مطالعه گزارش‌های امنیتی و آسیب‌پذیری‌های ثبت‌شده برای هر وابستگی
  • استفاده از ابزارهای تحلیل امنیتی برای بررسی زنجیره تامین
  • حذف وابستگی‌های غیرضروری و کاهش سطح حمله

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

 

۹) نبود محدودسازی نرخ درخواست‌ها (Rate Limiting)

محدودسازی نرخ درخواست‌ها یکی از سازوکارهای ضروری برای جلوگیری از سوءاستفاده از سرویس‌های وب است. در غیاب این سازوکار، مهاجمان می‌توانند تعداد زیادی درخواست را در مدت‌زمان کوتاه ارسال کنند و از این طریق حملاتی مانند Brute Force، سوءاستفاده از APIها یا ایجاد اختلال در سرویس را اجرا کنند. نبود Rate Limiting نه‌تنها امنیت سامانه را تهدید می‌کند، بلکه می‌تواند عملکرد و پایداری آن را نیز تحت تاثیر قرار دهد.

چرا این اشتباه خطرناک است

  • امکان اجرای حملات Brute Force برای حدس‌زدن رمز عبور فراهم می‌شود.
  • مهاجمان می‌توانند با ارسال درخواست‌های متعدد، منابع سرور را مصرف کرده و اختلال ایجاد کنند.
  • APIهای بدون محدودیت، در برابر سوءاستفاده خودکار بسیار آسیب‌پذیر هستند.
  • نبود کنترل نرخ درخواست‌ها می‌تواند به افزایش هزینه‌های زیرساختی منجر شود.

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

بهترین روش‌ها

  • تعیین سقف مشخص برای تعداد درخواست‌ها در بازه‌های زمانی مختلف
  • استفاده از مکانیزم‌های Throttling برای کاهش سرعت درخواست‌های مشکوک
  • اعمال محدودیت‌های سخت‌گیرانه‌تر برای مسیرهای حساس مانند ورود یا بازیابی رمز عبور
  • ثبت و تحلیل الگوهای درخواست برای شناسایی رفتارهای غیرعادی

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

 

۱۰) نداشتن راهبرد مانیتورینگ و پاسخ به حادثه

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

چرا این اشتباه خطرناک است

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

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

بهترین روش‌ها

  • استفاده از ابزارهای مانیتورینگ برای پایش مداوم ترافیک، خطاها و رفتارهای غیرعادی
  • تعریف هشدارهای خودکار برای رویدادهای حساس
  • ایجاد یک برنامه رسمی برای پاسخ به حادثه شامل نقش‌ها، مراحل و مسئولیت‌ها
  • تمرین دوره‌ای سناریوهای حمله برای افزایش آمادگی تیم

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

جمع‌بندی

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

چه امتیازی برای این مقاله میدهید؟

خیلی بد
بد
متوسط
خوب
عالی
5 از 1 رای

/@arastoo
ارسطو عباسی
کارشناس تست نرم‌افزار و مستندات

...

دیدگاه و پرسش
برای ارسال دیدگاه لازم است وارد شده یا ثبت‌نام کنید ورود یا ثبت‌نام

در حال دریافت نظرات از سرور، لطفا منتظر بمانید

در حال دریافت نظرات از سرور، لطفا منتظر بمانید

ارسطو عباسی

کارشناس تست نرم‌افزار و مستندات