برای مطالعه بخش قبل روی این آدرس کلیک کنید.
امضای کد (Code Signing)
توسعهدهندگان میتوانند کد خود را به صورت دیجیتالی امضا کنند تا شرکتها بدانند کد از کجا آمده است. به این ترتیب، آنها به برنامهای که از آن استفاده میکنند اعتماد میکنند، زیرا مطمئن هستند که برنامه هیچ آسیبی به سامانههای آنها وارد نمیکند. این امضای به کدهای یکپارچگی برنامه اضافه میشود، زیرا یک هش بر مبنای کدها ایجاد میشود، به این معنی که کد از طریق یک الگوریتم اجرا میشود و یک پاسخ تولید میشود که همراه با کدها ذخیره میشود. رویکرد فوق راهکاری در اختیار شما قرار میدهد تا نشان دهید که برنامهای که مصرفکننده قرار است از آن استفاده کند تغییری پیدا نکرده است.
برای آنکه برای فایلهای اجرایی مثل یک فایل DLL یا EXE، یا حتی یک اسکریپت، مانند یک اسکریپت PowerShell امضا کدی آماده کنید، نیازمند گواهی امضای کد هستید. این گواهینامه یک فایل الکترونیکی است که حاوی کلیدهایی است که برای امضای دیجیتالی فایلهای دیگر نیز قابل استفاده است.
رمزگذاری
رمزگذاری دادههای حساس یکی از نکات مهم در زمانی توسعه برنامهها است. در اینجا چند نکته وجود دارد که باید در هنگام بهکارگیری رمزنگاری در برنامههای کاربردی به آن دقت کنید. اولین مورد پروتکلهای ارتباطی است. اگر برنامه شما با سیستمهای دیگر در شبکه یا اینترنت در ارتباط است، آیا باید ارتباطات را رمزگذاری کنید؟ اگر دادههای حساسی را منتقل میکنید، پاسخ مثبت است. حوزه دیگری که باید در ارتباط با رمزگذاری به آن دقت کنید، ذخیرهسازی دادهها است. اگر اطلاعات حساسی را در یک فایل ذخیره میکنید، آن فایل باید رمزگذاری شود یا داده های موجود در فایل باید رمزگذاری شوند. اگر دادههای حساس در پایگاه داده ذخیره میکنید، مطمئن شوید که اطلاعات را همانطور که به شکل رمزنگاری شده در پایگاه داده ذخیره میشوند.
تکنیکهای دیگر
تعدادی از روشهای رایج کدگذاری امن وجود دارد که باید هنگام توسعه برنامهها از آنها پیروی کنید. اگر برنامهنویس نیستید، بلکه یک کارشناس امنیت اطلاعات سازمانی هستید باید از این تکنیکهای کدنویسی آگاه باشید و اطمینان حاصل کنید که برنامههای کاربردی داخلی شما با استفاده از این تکنیکها ساخته میشوند. هنگام توسعه برنامهها یا ارزیابی امنیت برنامهها، حتماً تکنیکهای کدنویسی امن را در زمینههای زیر بررسی کنید:
- نرمالسازی (Normalization): هنگام توسعه پایگاه داده برای برنامه، دادهها را به چند جدول تقسیم کنید تا افزونگی در دادهها کاهش یابد. به عنوان مثال، یک جدول مشتری در پایگاه داده وجود دارد که اطلاعات مشتری مانند شناسه مشتری، نام خانوادگی و نام خانوادگی را ذخیره میکند. هر بار که مشتری خریدی انجام میدهد، شما فقط شناسه مشتری را در جدول خرید ثبت میکنید و اطلاعات نام مشتری را ثبت نمیکنید.
- مبهم کردن/استتار (Obfuscation/camouflage): مبهمسازی و استتار اصول امنیتی رایجی هستند که با مبهم کردن یا نامشخص کردن یک ویژگی یا مؤلفه به دنیای امنیت افزوده میشوند. ایده این است که اگر درک یا ارزیابی ویژگیهای فنی کدنویسی یک نرمافزار سخت باشد، سوءاستفاده از کدها نیز سخت خواهد بود.
- استفاده مجدد از کد/ کد مرده (Code reuse/dead code): یک روش برنامهنویسی رایج است که میتواند امنیت برنامه را افزایش دهد. شما میتوانید مجموعهای از توابع را ایجاد کنید که از اصول کدنویسی ایمن پیروی میکنند و سپس آن توابع را در هر بخش از برنامه کاربردی که نیاز دارید فراخوانی کنید. اینکار با هدف کم کردن حجم کدهای تکراری در برنامهها انجام میشود. با اینحال، استفاده مجدد از کدها ممکن است باعث بروز آسیبپذیریهایی شود. همچنین باید کد خود را ارزیابی کنید و به دنبال کدهای مرده باشید. این کد اشاره به تابعی دارد که اجرا میشود و نتیجهای برمیگرداند، اما نتیجه هرگز در هیچ کجا در برنامه استفاده نمیشود. کد مرده باید حذف شود، زیرا این کد در صورت حفظ نشدن و فراموش شدن در طول زمان ممکن است در برابر یک اکسپلویت آسیبپذیر باشد. به عنوان مثال، ممکن است یک API داشته باشید که تابعی داشته باشد که دیگر استفاده نمیشود. تابع باید از API حذف شود تا مانع سوء استفادههای احتمالی از تابع شوید.
- اجرا و اعتبارسنجی سمت سرور در مقابل سمت سرویس گیرنده (Server-side vs. client-side): از دیدگاه طراحی ایمن برنامه، اجرای کد سمت سرور از کد سمت سرویس گیرنده ایمنتر است. کد سمت گیرنده یا کاربر را میتوان در کلاینت تغییر داد و واقعاً نباید به آن اعتماد کرد. به عنوان مثال، همیشه باید کد اعتبار سنجی را در سمت سرور پیادهسازی کنید، اما در صورت امکان اجرای کد اعتبار سنجی در سمت گیرنده و سرور ایرادی ندارد.
- مدیریت حافظه (Memory management): مهم است که یاد بگیرید که حافظه را به درستی مدیریت کنند. رویکرد فوق شامل آزاد کردن حافظه از اشیایی است که دیگر مورد استفاده قرار نمیگیرند با از بین بردن صحیح آن اشیا. اگر یک توسعهدهنده نتواند حافظه را پاک کند، ممکن است باعث نشت حافظه در برنامه شود.
- استفاده از کتابخانهها و SDKهای شخص ثالث (Use of third-party libraries and SDKs): استفاده از DLLهای شخص ثالث را در کیتهای برنامهنویسی و توسعه نرمافزار خود (SDK) محدود کنید. شما نمیدانید کد در آن مؤلفهها چقدر امن هستند، زیرا خودتان آنها را ننوشتهاید.
- دادههای در معرض خطر (Data exposure): حتماً مقدار دادههایی که توسط برنامه نشان داده میشوند را به دقت ارزیابی کنید و تا حد امکان نمایش دادهها را محدود کنید. یکی از تکنیکهای انجام این کار کپسولهسازی است. میتوانید از تکنیکهایی که اجازه میدهند کاربران بدون دسترسی مستقیم به دادهها با آنها در تعامل باشند.
چارچوبهای کاربردی و اسکریپت
از نکات دیگری که برای آزمون سکیوریتی پلاس باید به آنها دقت کنید به موارد زیر باید اشاره کرد:
Open Web Application Security Project
به عنوان یک متخصص امنیت، اگر مسئول تست نرمافزار برای ایمنسازی کدها هستید، حتما پروژه OWASP سرنام Open Web Application Security Project را بررسی کنید. این پروژه توسط یک جامعه آنلاین پشتیبانی میشود و شامل مقالات، ابزارها و اسناد زیادی است که روی آموزش افراد در ارتباط با آسیبپذیریهای رایج در برنامههای کاربردی وب و تکنیکهای امنیتی که برای محافظت از برنامههای کاربردی وب استفاده میشوند، متمرکز شده است.
میتوانید OWASP را در سایت www.owasp.org بررسی کنید. یکی از رایجترین اسنادی که از OWASP منتشر شده است، «OWASP Top 10» نام دارد که 10 آسیبپذیری برتر موجود در برنامههای وب را به تفصیل شرح میدهد. "OWASP Top 10" در نشانی https://owasp.org/www-project-top-ten قرار دارد.
Software Diversity
شما با انواع مختلفی از محیطهای نرمافزاری روبرو میشیود. به عنوان مثال، با کد کامپایل شده روبرو میشوید، زمانی که یک توسعهدهنده برنامهای را توسعه میدهد که سپس به یک فایل باینری کامپایل میشود (یک فایل اجرایی که قابل خواندن نیست).
مکانیزم فوق با برنامههای ایجاد شده در محیط اسکریپت متفاوت است. یک اسکریپت کامپایل نشده است، بنابراین میتوان آنرا به راحتی در یک ویرایشگر باز کرد، تغییر داد، ذخیره کرد و سپس دوباره اجرا کرد. اسکریپت توسط یک موتور برنامهنویسی که روی سیستم نصب شده است تجزیه و اجرا میشود.
در حالت کلی، تنوع نرمافزاری به معنای استفاده از کامپایلرهای مختلف برای ایجاد نسخههای کامپایل شده مختلف کد باینری است. مورد فوق شامل تصادفیسازی فایلهای باینری نیز میشود، جایی که میتوانید تصادفیسازی زمان اجرا را روی فایلهای باینری اعمال کنید تا بهرهبرداری از کد دشوارتر شود.
Automation/Scripting
بخش بزرگی از امنیت امروز این است که تا حد امکان همه چیز خودکار شود تا مجبور نباشید کارهای تکراری را بارها و بارها انجام دهید. اتوماسیون به معنای ایجاد اسکریپت برای انجام وظایف است. مزیت اتوماسیون این است که پس از ایجاد و آزمایش اسکریپتها، میتوانید مطمئن باشید که هر بار که اسکریپت را اجرا میکنید، فرآیند به روشی ثابت انجام میشود. موارد زیر زمینههای رایجی هستند که در آن اتوماسیون استفاده میشوند.
- دورههای اقدام خودکار (Automated courses of action): هدف اتوماسیون، خودکار کردن وظایف یا دورههای عملی است که باید بهطور منظم انجام دهید تا احتمال خطای انسانی در حین انجام آن وظایف کاهش یابد.
- تحویل مستمر (Continuous delivery): یک اصطلاح برنامهنویسی است که در آن تیمهای توسعه نرمافزار، نرمافزار را در دورههای کوتاه بهروزرسانی میکنند تا اطمینان حاصل کنند که میتوانند نسخه جدیدی را در هر زمانی منتشر کنند.
- اعتبار سنجی مستمر خودکارسازی (Continuous validation Automating): فرآیند اعتبارسنجی کد با استفاده از اسکریپتهایی انجام میشود که قبل از کامپایل و استقرار برنامه اجرا میشوند.
- استقرار مداوم (Continuous deployment): اشاره به حالتی دارد که برنامه کامپایل شده و در سیستم مستقر میشود.
- ادغام پیوسته (Continuous integration): فرآیندی که در آن هر بار که کد مجدداً در سیستم بررسی میشود، اعتبارسنجی میشود و در صورت موفقیتآمیز بودن اعتبار، کد را جمعآوری میکند.
- نظارت مستمر (Continuous monitoring): هنگامی که یک سیستم یا برنامه به کار گرفته میشود، اسکریپتهایی دارید که نظارت بر سلامت آن سیستم یا برنامه را خودکار میکنند.
کشش و مقیاسپذیری (Elasticity and Scalability)
اصطلاحات رایجی که امروزه میشنویم، به خصوص در مورد محاسبات ابری، کشش و مقیاسپذیری هستند. قرار دادن برنامهها در فضای ابری دستیابی به قابلیتهایی مثل کشش و مقیاسپذیری را فراهم میکند. کشش به این اصل اشاره دارد که محیط ابری میتواند منابع تخصیص یافته به برنامه را به صورت پویا بر اساس حجم کاری تنظیم کند. اگر بار سنگینی وجود داشته باشد، محیط ابری میتواند حافظه رم یا قدرت پردازش بیشتری را اختصاص دهد و سپس آن منابع را در صورت عدم نیاز کاهش دهد. مقیاسپذیری این واقعیت است که ارائه دهنده ابر میتواند به صورت دستی سرورهای بیشتری را در پس زمینه با افزایش تقاضا در مدت زمان طولانیتری عرضه کند.
ایمنسازی میزبان و برنامه
اکنون که اطلاعات نسبتا خوبی در ارتباط با بردارهای حمله پیرامون برنامههای کاربردی به دست آوردید و با برخی از تکنیکهای کدنویسی ایمن برای محافظت از برنامههای کاربردی آشنا شدید، اجازه دهید به تکنیکهای رایجی اشاره کنیم که میتوانند برای محافظت از سیستم میزبان و برنامهها در برابر حملات مورد استفاده قرار گیرند.
امنیت میزبان
چندین روش برای محافظت از سیستم میزبان در برابر کدهای مخرب در حال اجرا در سیستم وجود دارد. در زیر سه ویژگی امنیتی کلیدی وجود دارد که باید برای آزمون سکیوریتی پلاس اطلاعات کافی در مورد آنها داشته باشید.
- لیست مجاز (Allow list): که قبلاً به نام فهرست سفید شناخته میشد. میتوانید لیستی از برنامههایی که مجاز به اجرا در سیستم هستند ایجاد کنید و از اجرای هر برنامه دیگری جلوگیری کنید. رویکرد فوق کمک میکند تا اطمینان حاصل شود که فقط برنامههای آزمایش شده و تایید شده میتوانند در سیستمهای شرکت اجرا شوند.
- فهرست مسدود/ لیست رد (Block list/deny list): قبلاً به عنوان فهرست سیاه شناخته میشد. میتوانید یک لیست بلوک برنامه ایجاد کنید (یا لیست را رد کنید). در این روش همه برنامهها مجاز به اجرا در سیستم هستند به جز هر برنامهای که در لیست مسدود/رد قرار دارد. رویکرد فوق یک راه عالی برای مدیریت بر برنامههایی است که روی سامانهها اجرا میشوند. در این حالت برنامههای مخربی که توسط ایمیل برای کارمندان ارسال میشوند، شانس اجرا روی سیستم را ندارند.
- روشهای کدنویسی ایمن (Secure coding): پیروی از روشهای کدنویسی ایمن که قبلاً در مورد آنها صحبت کردیم بسیار مهم است، از جمله آزمایش برنامه قبل از استقرار آن در محیط تولید.
امنیت برنامه (Application Security)
برای کمک به بهبود امنیت برنامههای کاربردی به اصول زیر دقت کنید:
- اعتبار سنجی ورودی (Input validations): اگر برنامهنویسان نرمافزار ورودی ارسال شده به برنامه را قبل از پردازش آن تأیید کنند، میتوان از وقوع بسیاری از حملات علیه برنامهها جلوگیری کرد. رویکرد فوق مانع بروز حملاتی مثل حملات تزریقی و حملات اسکریپت بین سایتی میشود.
- کوکیهای امن (Secure cookies): کوکیها برای ذخیره تنظیمات برگزیده کاربران هنگام بازدید از یک وبسایت استفاده میشوند. کوکیها از سمت کلاینت برای وب سرور ارسال میشوند تا اطلاعات را بخوانند و سایت را مطابق با اولویت کاربر تنظیم کنند. استفاده از کوکیهای ایمن یک پرچم را روی یک کوکی قرار میدهد به طوری که تنها در صورتی که سایت از HTTPS استفاده میکند به وب سرور ارسال میشود.
- هدرهای پروتکل انتقال ابرمتن Hypertext Transfer Protocol (HTTP) headers: امروزه پروتکل http از مقادیر هدرها پشتیبانی میکند که میتواند امنیت برنامههای کاربردی وب را بهبود بخشد و در برابر حملات کلیکی و اسکریپت بین سایتی از وبسایتها محافظت کند. برای مثال، میتوانید از هدر Content-Security-Policy برای کنترل منابع مجاز برای اسکریپتها، سبکها و تصاویر استفاده کنید.
- امضای کد (Code signing): امضای کد یک ویژگی مهم برای تأیید یکپارچگی کد برنامه است. به دلایل امنیتی، بسیاری از محیطها فقط کدهایی را اجرا میکنند که به صورت دیجیتالی با گواهی امضای کد توسط یک منبع قابل اعتماد امضا شده است.
کیفیت کد و تست (Code Quality and Testing)
یک روش ساخت یک کلید ایمن برای برنامههای کاربردی این است که مطمئن شوید که آزمایشهای دورهای و ارزیابی کدها به درستی انجام شده است. از روشهای معروف در این زمینه به موارد زیر باید اشاره کرد:
- تحلیل کد استاتیک: تحلیل کد استاتیک معمولاً اولین نوع آزمایش کد است و شامل بازبینی کد برای شناسایی مشکلات بدون اجرای آن است. این کد را میتوان به صورت دستی بررسی کرد و توسط تیمی از توسعهدهندگان بررسی کرد، اما ابزارهایی به نام تحلیلگر کد استاتیک نیز وجود دارد که میتوانند کدها را بررسی کنند و آسیبپذیریهای احتمالی را بررسی کنند.
- تحلیل کد پویا: تجزیه و تحلیل پویا شامل آزمایش کد با اجرای آن و مشاهده نحوه پاسخ برنامه در هنگام استفاده در سیستم است. نمونههایی از تجزیه و تحلیل پویا شامل اجرای آزمون های واحد، تستهای یکپارچهسازی، تستهای سیستمی و آزمونهای پذیرش است.
- آزمایش استرس: آزمایش استرس نوعی آزمایش است که بار زیادی را بر روی برنامه وارد میکند تا مشخص شود اگر تعداد زیادی کاربر همزمان از برنامه استفاده کنند، چه واکنشی نشان میدهد.
- جعبه شن (Sandboxing ): اصطلاحی است برای اجرای کدهایی که در یک محیط ایزوله و به دور از سیستمهای تولیدی، اجرا میشوند تا تاثیرات کدها روی سیستمها ارزیابی شوند.
- تأیید مدل (Model verification): یک مدل، شبیهسازی یک برنامه واقعی توسعه داده شده است، اما همه عملکردها در مدل برنامهریزی نشدهاند. هدف این است که مدلهایی در طول مراحل اولیه توسعه برنامه ایجاد میشوند تا تأیید شود که مشتری از عناصر اصلی برنامه راضی است. مدل باید به طور منظم تأیید شود تا اطمینان حاصل شود که نیازهای مشتری را برآورده میکند.
Fuzzing
مهم است هر نرمافزاری که ایجاد میکنند با وارد کردن عمدی اطلاعات نامعتبر در تمام صفحههای ورود، برنامه را به دقت آزمایش کنید. اصطلاح تست نرمافزار با دادههای نامعتبر یا تصادفی در فیلدهای ورودی یک برنامه Fuzzing نام دارد.
برای آزمون سکیوریتی پلاس باید بدانید که برنامهها باید با وارد کردن عمدی دادههای نامعتبر در هر صفحه ورود، آزمایش شوند. این نوع تست نرمافزار fuzzing نام دارد.
تا این بخش از آموزش سکیوریتی پلاس با حملات متداول پیرامون برنامهها و تکنیکهای رایجی که توسط توسعهدهندگان برای کاهش احتمال سوء استفاده از نرمافزار از آنها استفاده میکنند، آشنا شدید. در زیر چند نکته کلیدی وجود دارد که باید برای آزمون سکیوریتی پلاس به آنها دقت کنید.
- برای ایمن کردن محیط برنامه، توسعهدهندگان باید قبل از پردازش اطلاعات، ورودیهایی که برای برنامه ارسال میشود را تأیید کنند. بهعنوان مدیر شبکه، میتوانید با حذف ویژگیهای غیرضروری، برنامه را ایمنتر کنید و با پیکربندی برنامه در حالت امن، یک خط پایه امنیتی برنامه ایجاد کنید.
- توسعهدهندگان باید از SDLC پیروی کنند، که مراحل اصلی توسعه برنامه را مشخص میکند. این مراحل شامل جمعآوری و تحلیل نیازمندیها، طراحی، پیادهسازی، آزمایش، استقرار و نگهداری است.SDLC سرنام System Development Life Cycle در مهندسی نرمافزار و رشتههای مرتبط با موضوع سیستمهای اطلاعاتی مورد استفاده قرار میگیرد و موضوع آن تشریح فرآیندهای مرتبط با برنامهریزی و هدف گذاری، تحلیل، تولید، آزمایش، استقرار و نگهداری سیستمهای نرمافزاری است. این چرخه میتواند در برگیرنده فرایندهای مربوط به تأمین سختافزار یا ترکیبی از سختافزارها و نرمافزارها است. نام بردن از چرخه حیات سیستم نباید توأم با غفلت از پویایی و تحولی باشد که این مفهوم طی دهههای اخیر تجربه کردهاست و همچنان دستخوش آن است. مهندسان نرمافزار و کلیه افراد دیگری که در سطوح مختلف در یک پروژه نرمافزاری با آنها همکاری میکنند، باید در مورد استنباط خود از مفهوم و وزن نسبی هریک از این گامها در چارچوب متدولوژی که انتخاب شدهاست درک روشن و مشترکی داشته باشند.
- توسعهدهندهها باید مدیریت صحیح خطا و اعتبارسنجی ورودی را در کد خود پیادهسازی کنند تا خطرات سایبری پیرامون برنامهها به حداقل برسد.
- حمله تزریق SQL شامل این موضوع است که هکر دستورات SQL را در فرمهای یک برنامه کاربردی وارد میکند و سعی میکند آنچه را که برنامه انجام میدهد را کنترل کند.
- حمله سرریز بافر زمانی است که هکر دادههای زیادی را به یک برنامه کاربردی ارسال میکند که معمولاً منجر به دسترسی هکر به پوسته با مجوزهای مدیریتی میشود.
- اکسپلویت روز صفر سوء استفادهای است که برای فروشنده برنامه ناشناخته است، اما برای جامعه هکرها شناخته شده است.
- برای جلوگیری از حملات بر علیه برنامههای کاربردی، توسعهدهندگان باید قبل از پردازش دادهها، ورودیها را اعتبارسنجی کنند تا مطمئن شوند که ورودیهای درستی در اختیار برنامه قرار گرفته است. مدیران شبکه میتوانند با وصله منظم همه نرمافزارها و سیستم عاملها مانع اجرای حملات پیرامون برنامههای کاربردی میشوند.
- به یاد داشته باشید که یک برنامه کاربردی باید به این ترتیب در محیط زیر مستقر شود: توسعه → آزمایش → مرحله بندی → تولید → تضمین کیفیت (QA).
- توسعهدهندگان باید مکانیزم مدیریت خطا را در محیطهای برنامهنویسی با پیادهسازی بلوکهای try/catch پیادهسازی کنند.
- هر دادهای که به یک برنامه وارد میشود باید قبل از پردازش اعتبار سنجی شود.
- رویههای ذخیره شده باید برای پیشگیری از بروز حملات تزریق SQL انجام شوند.
- در برنامههای توزیع شده، اعتبار سنجی ورودی را در سمت مشتری و سمت سرور (به ویژه در سمت سرور) پیاده امنیت میزبان و برنامه را پیاده سازی کنید.
- با استفاده از لیست مجاز (که قبلاً به عنوان لیست سفید شناخته میشد) میتوانید برنامههایی را که مجاز به اجرا در یک سیستم هستند کنترل کنید.
- شما میتوانید با استفاده از لیست بلاک/رد کردن (که قبلاً به عنوان لیست سیاه شناخته میشد) از اجرای یک برنامه خاص در یک سیستم جلوگیری کنید.
- Fuzzing راهی برای آزمایش نحوه پاسخگویی یک برنامه کاربردی به ورودی تصادفی است.
تا این بخش از آموزش سکیوریتی پلاس اطلاعاتی در ارتباط با بردارهای حملهای که پیرامون برنامههای کاربردی قرار دارند به دست آوردیم. اکنون وقت آن رسیده تا مبحث امنیت پیرامون برنامههای ابری و محیطهای مجازی را بررسی کنیم. نکتهای که باید به آن دقت کنید این است که مقوله ابر یکی از مهمترین مباحث این روزهای دنیای فناوری است، از اینرو ضروری است اطلاعات کافی در ارتباط با ایمنسازی این محیطها به دست آورید.
برای مطالعه بخش بعد اینجا کلیک کنید.
برای مطالعه تمام قسمتهای آموزش سکیوریتی پلاس اینجا کلیک کنید.
تبلیغات لینکی:
ماهنامه شبکه را از کجا تهیه کنیم؟
ماهنامه شبکه را میتوانید از کتابخانههای عمومی سراسر کشور و نیز از دکههای روزنامهفروشی تهیه نمائید.
ثبت اشتراک نسخه کاغذی ماهنامه شبکه
ثبت اشتراک نسخه آنلاین
کتاب الکترونیک +Network راهنمای شبکهها
- برای دانلود تنها کتاب کامل ترجمه فارسی +Network اینجا کلیک کنید.
کتاب الکترونیک دوره مقدماتی آموزش پایتون
- اگر قصد یادگیری برنامهنویسی را دارید ولی هیچ پیشزمینهای ندارید اینجا کلیک کنید.
نظر شما چیست؟