PDA

View Full Version : امنیت در برنامه های تحت شبکه



mmbguide
پنج شنبه 23 خرداد 1398, 09:37 صبح
سلام

من یه برنامه تحت شبکه نوشتم و چندین شرکت برای ارائه بردم و به یه سوال هرگز نتونستم جواب بدم. "برای امنیتش کاری کردی؟" و جواب هم خیر بوده.

برنامه من به زبان دات نت نوشته شده یکسری DLL به زبان C# و یکسری به زبان VB.NET و بانک اطلاعاتی هم SQL هستش و در سرور قرار داره. مطابق معمول هر برنامه، مدیر برنامه میتونه سطح دسترسی تعریف کنه. برنامه بصورت سه لایه نوشته شده و شیوه ارتباط برنامه به بانک اطلاعاتی بواسطه DataSetها انجام میشه. اما در خصوص سوال شرکت ها راجع به امنیت برنامه، سوالم این هستش که منظورشون چیه؟

امنیت بستر شبکه که فکر میکنم باید توسط کارشناس IT و بخشی توسط مدیر بانک اطلاعاتی (DBA) انجام بشه. نکته مبهم برای من اینه که از طرف من که برنامه نویس هستم باید چه اقدامی انجام بشه. عمده عملیات ها در بانک اطلاعاتی توسط StoredProcedure ها انجام میشه و من فقط پارامترها رو مقدار دهی میکنم.

ممنون میشم دوستان کمک کنند که بتونم مفهوم امنیت رو در چنین برنامه هایی بیشتر درک کنم

محمد آشتیانی
پنج شنبه 23 خرداد 1398, 17:24 عصر
سلام
شما میتونید استاندارد هایی که برای امنیت نرم افزار تدوین شدند رو مطالعه کنید و سعی در پیاده سازی ملزومات اونها داشته باشید
مثلا یکی از این استاندارد ها OWASP هست (که البته برای اپلیکیشن ها تحت وب تدوین شده در اصل ، اما نکات پایه ای در اون وجود داره که در همه اپلیکیشن ها میتونه رعایت بشه) ، میتونید با مطالعه سند فارسی شده اون که در وبسایت خودش ارائه داده اطلاعاتی کسب کنید
https://www.owasp.org/images/9/91/OWASP_ASVS_Version_2_Persian.pdf

دقت کنید همه موارد این استاندارد ، در اپلیکیشن های ویندوزی وجود ندارند ، اما موردی مثل Injection که مورد اول از لیست 10 مورد آسیب پذیری مهم در سال 2017 هست ، محدود به وب نیست و شما همه جا باید این مورد مهم رو رعایت کنید.
موارد دیگری که میشه بهش اشاره کرد ، تامین امنیت ارتباطات کلاینت و سرور ، رمزنگاری اطلاعات حساس و مواردی از این قبیل هست.

این فقط یکی از انواع استاندارد ها و اسنادی هست که برای تامین امنیت نرم افزار ها تدوین شده و خدمتتون معرفی کردم

mmbguide
پنج شنبه 23 خرداد 1398, 19:23 عصر
ممنون جناب آشتیانی

davidrobert
جمعه 24 خرداد 1398, 00:21 صبح
ممنون جناب آشتیانی

تو برنامه نویسی سعی کنید کدهاتون مبهم کنید و بعد به سازمان بدید این مورد کمک میکنه چون رشته اتصال تون دست کسی بیفته خطر ناک هستش ولی وقتی رشته اتصال و تمام کدها مبهم کنید توسط Smart assembly که خیلی بهتر هستش اگه dll و فایل اختصاصی دارید مبهم کنید و به مشتری بدید باز بهتر هستش. اگه از قفل سخت افزاری تحت شبکه استفاده در صورت خطر رویت شد قفل میکشید و همه کاربرها از برنامه میفتن بیرون که این مورد هم خوب هستش.

mmbguide
جمعه 24 خرداد 1398, 10:24 صبح
البته یک تاپیک درخصوص مبهم سازی وجود داره که من هنوز نتونستم جوابی بگیرم. دلیلش هم اینه که وقتی Referenceهای مبهم شده را به پروژه اضافه میکنم برنامه با خطا مواجه میشه ولی خود برنامه با کدهای درون خودش بدرستی کار میکنه.

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

تشکر

davidrobert
جمعه 24 خرداد 1398, 12:02 عصر
البته یک تاپیک درخصوص مبهم سازی وجود داره که من هنوز نتونستم جوابی بگیرم. دلیلش هم اینه که وقتی Referenceهای مبهم شده را به پروژه اضافه میکنم برنامه با خطا مواجه میشه ولی خود برنامه با کدهای درون خودش بدرستی کار میکنه.

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

تشکر

بله روش مبهم سازی مهم من با اسمارت اسمبلی مبهم کرد و برنامه هم پیامک میده، هم با کارت خوان ارتباط داره و هم با تلفن و تحت شبکه هم هستش ولی بدون هیچ مشکلی با همه Dll ارتباط داره و خطای هم بهم نمیده و برنامه بدون مشکل روی سیستم مشتری کار میکنه

mr.sirwan
جمعه 24 خرداد 1398, 12:22 عصر
البته یک تاپیک درخصوص مبهم سازی وجود داره که من هنوز نتونستم جوابی بگیرم. دلیلش هم اینه که وقتی Referenceهای مبهم شده را به پروژه اضافه میکنم برنامه با خطا مواجه میشه ولی خود برنامه با کدهای درون خودش بدرستی کار میکنه.

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

تشکر

احیانا شما اومدی تک تک dll هارو بصورت جداگانه مبهم سازی کردی؟ در این حالت احتمال خطا و اجرا نشدن برنامه خیلی زیاده، شما فقط کافیه فایل اصلی برنامه تون یعنی همون فایل exe رو توسط Smart assembly باز کنین خود smart assembly بصورت خودکار رفرنس هارو پیدا میکنه و براتون لیست میکنه

mmbguide
جمعه 24 خرداد 1398, 13:01 عصر
بله دقیقا. من تک تک پروژه ها (DLLها) رو مبهم کردم و بعد به پروژه اصلی به عنوان Reference اضافه کردم و در انتها پروژه اصلی رو مبهم کردم. و نکته ای که گفتید رو نمیدونستم و امتحان میکنم. ولی سوالم اینه که اگر من برای یک پروژه ای که متعلق به من نیست و نتونم DLL خودم رو جداگانه مبهم کنم پس چطوری باید اون رو به افراد دیگه ارائه کنم. ممنون

mr.sirwan
جمعه 24 خرداد 1398, 13:12 عصر
گفتم که فقط کافیه فایل Exe رو توی smart باز کنین، فایل dll شما شناسایی میشه و میتونین داخل فایل exe اصلی مدفون (merge و یا embed) و مبهمش کنید

mmbguide
جمعه 24 خرداد 1398, 14:00 عصر
پیرو مطلب شماره #2:

از اونجایی که سرور پروژه تنها به برنامه SQL مجهز شده، آیا لازمه که برای ایجاد ارتباط (امن و رمزگذاری شده) با SQL از تکنولوژی و یا شیوه خاصی مثل WCF استفاده بشه و یا به تنهایی بین برنامه نوشته شده در دات نت و SQL میشه الزامات ASVS (آنهایی که برای WinForm ممکن هست) رو پیاده سازی کرد؟ ممنون اگر توضیح بدید

mmbguide
جمعه 24 خرداد 1398, 14:02 عصر
گفتم که فقط کافیه فایل Exe رو توی smart باز کنین، فایل dll شما شناسایی میشه و میتونین داخل فایل exe اصلی مدفون (merge و یا embed) و مبهمش کنید

البته منظورم این هستش که من به سفارش یک برنامه نویس یک DLL براش آماده کردم و قرار از این فایل استفاده کنه و من هم میخوام DLL رو مبهم سازی کنم، ایا برای استفاده کننده دوم مشکلی پیش نمیاد. برای این مشکل راه حل چیه؟ ممنون

davidrobert
جمعه 24 خرداد 1398, 14:31 عصر
البته منظورم این هستش که من به سفارش یک برنامه نویس یک DLL براش آماده کردم و قرار از این فایل استفاده کنه و من هم میخوام DLL رو مبهم سازی کنم، ایا برای استفاده کننده دوم مشکلی پیش نمیاد. برای این مشکل راه حل چیه؟ ممنون

سر مبهم سازی فایل Dll و استفاده ازش تو کدنویسی هنگام کدنویسی نه با مشکلی برخورد نمیکنید من خودم تمام کلاس و دستورات کاریم مبهم کردم و به پروژه ام دادم و دستورات ام میزدم میامد و کار میکرد ولی با نرم افزار که سورس میزدم ببینم کد درست حسابی بهم نشان نمیداد یعنی همه چیز نشان داد جز کدهای خودم ولی تو کدنویسی مشکلی نبود. راحت کد صدا میکردم و استفاده بدون مشکل خیالت راحت مبهم کنی بدی باز میتونه استفاده کنه ولی کدش نمیتونه ببینه چی هستش

ASKaffash
شنبه 25 خرداد 1398, 10:48 صبح
سلام
برای تامین امنیت باید کارهای ذیل را انجام دهید :
- حتما Access Modifier ها را صحیح انتخاب کنید ترجیحا private , internal ( در غیر اینصورت با Obfuscate شدن هم قابل نفوذ است) همچنین استفاده از dll بعلت استفاده از member های public و protected یک دردسر امنیتی است اگر لازم است بعضی از کلاس های مهم را sealed کنید
- حتما با حمله Injection مقابله کنید به خصوص کارکتر سینگل کوتیشن در تکست باکس ها
- حتما ConnetionString را Encrypt کنید
- باید حتما با ابزار مناسب برنامه را Obfuscate کنید (اگر از internal و private استفاده کرده باشید نتیجه obfuscate خیلی مناسب تر است)
- در صورت مقدور hash فایل اجرایی را درون برنامه کنترل کنید

محمد آشتیانی
شنبه 25 خرداد 1398, 18:28 عصر
سلام
بنده پروسه Obfuscation رو جزو بحث امنیت نرم افزار به معنی اصلیش نمیدونم هیچوقت هم لزومی ندیدم به انجامش ، مفاهیم امنیت نرم افزار توی استاندارد ها تعریف شده و حدودا محدودش مشخصه.
ببینید ، مثلا شما نرم افزارتون رو باید از نرم افزارهایی که قادر به کشف رمز عبور شما هستند حفاظت کنید (برای مثال کنترل حداقل پیچیدگی رمز کاربران هنگام تنظیم و تغییر رمز و یا اعتبار سنجی کاربران سمت سرور و حتی اجرای محدودیت برای دفعات لاگین نا موفق به همراه ثبت لاگ برای تمام این مراحل) ، یا مثلا دیتای حساس شما ، اعم از کانکشن استرینگ ، اطلاعات کاربری و رمزهای عبور ، احتمالا اطلاعات مالی و ... رمز نگاری کنید.
حفظ امنیت ارتباطات بین کلاینت ها و سرور (سرویس ها) از اهمیت بالایی برخورداره که قابلیت سرقت وجود نداشته باشه (برای این منظور استفاده از SSL راه حل مطمئنی هست)
مواردی که باید رعایت بشه لیست بلندی از موارد هست که اشاره به همه اونها در حوصله این تاپیک نمیگنجه و اصلا این خودش یک شاخه ی مهم در توسعه نرم افزار هست (همون داکیومنتی که در پست قبلی پیوست کردم ، از صفحه 16 به بعد چک لیست نسبتا کاملی از اقداماتی که باید انجام بشه تا نرم افزار شما سطوح مختلف استاندارد OWASP رو پاس کنه ، ارائه شده و خوندنش میتونه کمک بسیاری بکنه)
در نهایت این بحث ، بسیار بحث گسترده ای هست که البته داخل ایران (شرکت ها / توسعه دهنده ها) اکثرا خودشون رو مقید به اعمال اون ها نمیدونن و نتیجش میشه هر از چند گاهی افشای اطلاعات کاربران و ...

در مورد پست شماره 10:
اصولا ارتباط مستقیم نرم افزار کلاینت با دیتابیس سرور راه حل خوبی نیست ، و بهتر هست نرم افزار کلاینت با یک سرویس در ارتباط باشه و نهایتا سرویس درخواست های کلاینت ها رو پاسخ بده و از طرفی سرویس با دیتابیس سرور در ارتباط باشه (البته که ارتباط سرویس و دیتابیس سرور هم باید محافظت شده باشه همونطور که بالاتر عرض شد)
جستجو با این کلید واژه ها میتونه کمک کنه
Encrypted Connections to the Database Engine
Configure SSL encryption in SQL Server

موفق باشید