PDA

View Full Version : حرفه ای: کمک در رابطه با طراحی نرم افزار کلاینت سرور مالی بزرگ



r0ot$harp
چهارشنبه 26 مهر 1391, 18:58 عصر
سلام دوستان عزیز

ما یه سیستم رو در حال تحلیل هستیم که به صورت کلاینت سروری هست. مشکل اصلی و بزرگ ما بانک اطلاعاتی هست. نرم افزار قسمت دیتابیس داره و قسمت کلاینت ها. این کلاینت ها با کلی از جداول بانک اطلاعاتی در ارتباط هستند. مشکل اصلی اینجا بوجود میاد که این نرم افزار یه سیستم کاملا مالی هست. داخل سیستم کلی Transaction های مالی انجام می شه. فهمیدن Connection String باعث فاجعه می شه. واسه اینکه اگر کسی پسور DB رو پیدا کنه ما بیچاره می شیم. به همین خاطر نظر ما استفاده از WCF هست. اما استفاده از سرویس کلی مشکلات از قبیل برنامه نویسی زیاد رو بوجود میاره. می خوام بدونم دوستان نظری در این رابطه دارند؟؟؟

این رو هم بگم تعداد کلاینت ها شاید به 20 هزار تا برسه. که در بهترین شرایط 1000 کلاینت آنلاین هستند.

قبلا یه SP نوشتم که روی فیلد ها فیلتر می کرد. به این صورت که هر کاربر یه نام کاربر هم تو DB داشت. زمانی که کاربر Login می کرد نام کاربری و رمزعبورش هم تو DB موجود بود. بعد هر کاربر به یک SP به نام ExeSQL دسترسی داشتند. هر جدول دارای فیلی بنام IdUser بود. وقتی کاربر به برنامه Login می کرد و Query ارسال می کرد Query با استفاده از روشی خاص نام کاربری رو پیدا و هر دستوری که اجرا می شد با استفاده از IdUser اون Query رو فیلتر می کرد. با این روش هر کاربر فقط رکورد هایی رو می تونست ببینه که خودش ایجاد کرد و IdUser خودش تو اون رکورد بود. اما به دلایلی نمی خوام از این روش استفاده کنم.

سوال اصلیم این هست که نرم افزار های اتوماسیون اداری از چه روش برای ارتباط با سرور استفاده می کنند؟؟؟
به دلیل امنیت پایین کد های .Net تو ریسورس شدن اصلا نمیشه از چیزی استفاده کرد.


باتشکر احسان

Padrone
چهارشنبه 26 مهر 1391, 21:14 عصر
چرا Connection String رو با استفاده از چند تا تابع قوی Encrypt نمی کنید؟

r0ot$harp
چهارشنبه 26 مهر 1391, 23:19 عصر
چرا Connection String رو با استفاده از چند تا تابع قوی Encrypt نمی کنید؟
دوست عزیز فایده این کار چیه؟؟؟ زمانی که می خوایم یه Connection String رو کد کنیم بالاخره باید با استفاده از الگوریتمی این کار رو بکنیم، خوب کسی که سورس رو باز کنه الگوریتم هم پیدا می کنه. در ضمن چگونه Connection String کد شده رو به دیتابیس بفرسیتم!!!!!!!!!!!!!


باتشکر احسان

r0ot$harp
جمعه 28 مهر 1391, 00:01 صبح
این روزا انجمن پر شده از تاپیک های بیهوده که روز 3 صفحه زیاد می شه. فکر می کنم مدیر انجمن باید یه فکری برای این موضوع بکنه. چون واقعا موضوعاتی که می تونه خیلی داغ باشه به راحتی صفحه ها از دید کنار می ره.

دوستان خوشحال می شم تو این تاپیک در باره موضوع تاپیک بحث کنیم.

باتشکر احسان

veniz2008
جمعه 28 مهر 1391, 00:10 صبح
این روزا انجمن پر شده از تاپیک های بیهوده که روز 3 صفحه زیاد می شه. فکر می کنم مدیر انجمن باید یه فکری برای این موضوع بکنه. چون واقعا موضوعاتی که می تونه خیلی داغ باشه به راحتی صفحه ها از دید کنار می ره.
سلام.
منم با شما موافقم. متاسفانه "تاپیک های تکراری" و "پست های تکراری در یک تاپیک" تالار رو خشک و کسل کننده کرده.
فکر کنم سوالتون رو اگر در تالار تحلیل و طراحی بانک اطلاعاتی مطرح میکردید حداقل یه جواب نصف و نیمه میگرفتی.
موفق باشی دوست عزیز.

r0ot$harp
جمعه 28 مهر 1391, 00:17 صبح
سلام.
منم با شما موافقم. متاسفانه "تاپیک های تکراری" و "پست های تکراری در یک تاپیک" تالار رو خشک و کسل کننده کرده.
فکر کنم سوالتون رو اگر در تالار تحلیل و طراحی بانک اطلاعاتی مطرح میکردید حداقل یه جواب نصف و نیمه میگرفتی.
موفق باشی دوست عزیز.
والا تقریبا ما تمام تکنولوژی و موارد کاری رو انتخاب کردیم. اما از اونجایی که خودم اتوماسیون تا حالا کار نکردم می خوام بدونم بهترین روش همین استفاده از سرویس هست یا نه روش های بهتر و بهینه تری هم هست. خیلی تو اینترنت گشتم. چیزه زیاده پیدا نکردم. حتی اون SP هم که گفنم طراحی کردم با خیلی از طراح و برنامه نویس های بانک اطلاعاتی مشورت کردم اما نتونستن کمک کنند. در نهایت با سعی 2 هفته ای تونستم بنویسمش.


باتشکر احسان

Amir Oveisi
جمعه 28 مهر 1391, 10:57 صبح
اگر مشکل فقط ConnectionString هست راه های زیادی برای حلش وچود داره. مثلا:
1- اطلاعات حساس رو داخل conntectio string قرار ندید و اون ها رو در زمان اجرا، از کاربر دریافت کرده و به connection string اضافه کنید.
2- محتوای connection string رو رمزنگاری کنید (با الگوریتم های مناسب) و در زمان مورد نیاز اون رو رمزگشایی کنید. (به صورت دستی ممکنه یه مقدار کار بخواد این روش)
3- میتونید از قابلیت های رمزنگاری خود دات نت برای این کار استفاده کنید که مختص محافظت از اطلاعات configuration طراحی شده. این ابزار ها به صورت خودکار section های مشخص شده رو رمزنگاری کرده و در زمان مورد نیاز به صورت خودکار رمزگشایی می کنند. در واقع برنامه نویس دیگه درگیر جزئیات نخواهد شد. به عنوان نمونه کد زیر رو ببینید:
var configFile = WebConfigurationManager.OpenWebConfiguration(Syste m.Web.HttpRuntime.AppDomainAppVirtualPath);
if (configFile != null)
{
var section = configFile.Sections["connectionStrings"];
section.SectionInformation.ProtectSection("DataProtectionConfigurationProvider");
section.SectionInformation.ForceSave = true;
configFile.Save(ConfigurationSaveMode.Modified);
}


4- استفاده از معماری های SOAP مانند Web Serivce ها و WCF. شخصا این روش رو بیشتر می پسندم. اولا اینکه لایه های منطقی برنامه رو به شکل بهتری میشه با این ابزار از هم جدا کرد و دوم اینکه سمت کلاینت همیشه میدونه که با سرویسی با این ویژگی ها قراره در ارتباط باشه و فقط اون سرویس (ها) رو میشناسه و به هیچ وجه از وجود موجودی به اسم سرور اطلاعی نداره که این موضوع هم از نظر مباحث امنیتی میتونه مفید باشه و هم از نظر مباحث طراحی loosely coupled.
در ضمن اگر از این روش استفاده کنید خواهید دید که develope با این روش ساده تر و روان تر هست.

موفق باشید

r0ot$harp
جمعه 28 مهر 1391, 11:51 صبح
اگر مشکل فقط ConnectionString هست راه های زیادی برای حلش وچود داره. مثلا:
1- اطلاعات حساس رو داخل conntectio string قرار ندید و اون ها رو در زمان اجرا، از کاربر دریافت کرده و به connection string اضافه کنید.
2- محتوای connection string رو رمزنگاری کنید (با الگوریتم های مناسب) و در زمان مورد نیاز اون رو رمزگشایی کنید. (به صورت دستی ممکنه یه مقدار کار بخواد این روش)
3- میتونید از قابلیت های رمزنگاری خود دات نت برای این کار استفاده کنید که مختص محافظت از اطلاعات configuration طراحی شده. این ابزار ها به صورت خودکار section های مشخص شده رو رمزنگاری کرده و در زمان مورد نیاز به صورت خودکار رمزگشایی می کنند. در واقع برنامه نویس دیگه درگیر جزئیات نخواهد شد. به عنوان نمونه کد زیر رو ببینید:
var configFile = WebConfigurationManager.OpenWebConfiguration(Syste m.Web.HttpRuntime.AppDomainAppVirtualPath);
if (configFile != null)
{
var section = configFile.Sections["connectionStrings"];
section.SectionInformation.ProtectSection("DataProtectionConfigurationProvider");
section.SectionInformation.ForceSave = true;
configFile.Save(ConfigurationSaveMode.Modified);
}


4- استفاده از معماری های SOAP مانند Web Serivce ها و WCF. شخصا این روش رو بیشتر می پسندم. اولا اینکه لایه های منطقی برنامه رو به شکل بهتری میشه با این ابزار از هم جدا کرد و دوم اینکه سمت کلاینت همیشه میدونه که با سرویسی با این ویژگی ها قراره در ارتباط باشه و فقط اون سرویس (ها) رو میشناسه و به هیچ وجه از وجود موجودی به اسم سرور اطلاعی نداره که این موضوع هم از نظر مباحث امنیتی میتونه مفید باشه و هم از نظر مباحث طراحی loosely coupled.
در ضمن اگر از این روش استفاده کنید خواهید دید که develope با این روش ساده تر و روان تر هست.

موفق باشید

تشکر دوست عزیز.

ما برای یکی از نرم ازفزارها در بانک ملی از این روش استفاده کردیم. روش خوبی هست در ضمن مشکل امنیت رو واقعا حل می کنه. روش به این صورت هست که مثلا می خوایم کارمندی رو در بانک اضافه کنیم. در ابتدا برای هرکاری سرویس تعریف کردیم:
SV_UserAdd=011120255625
خوب این شد سرویس ما. حالا هر پکتی که به سمت سرور ارسال می کنیم به صورت زیر هست:

RSA_ENC_2048(AES_ENC_256(Service|Username|password |FirstName|LastName|Email|Tel|NationalCode|Persona lCode|Application Version|Message Signing))

خوب این شد رشته اطلاعاتی ما برای ارسال به سرور که از دو کانال رمزنگاری رد می شه. در ابتدا AES و بعد RSA. تا اینجا امنیت بسیار بالا هست. قسمت آخر که Message Signing هست، به صورت زیر عمل می کنیم:

MD5(RawData(Service|Username|password|FirstName|La stName|Email|Tel|NationalCode|PersonalCode|Applica tion Version))
منظور از Raw Data یعنی Data که هنوز کد نشده و خام هست.

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

در قسمت بعدی می خوام ارسال اطلاعات رو از سرور به کلاینت به صورت DataTable توضیح بدم. مثلا ما می خوایم لیست کاربران رو برای کلاینت ارسال کنیم. برای این کار هم کد سرویسی موجود هست. در سرور ما DataTable رو به XML تبدیل می کنیم. سپس اون رو با استفاده از GZIP فشرده می کنیم. سپس رشته کد شده رو با Base64 کد کرده و به کلاینت ارسال می کنیم. کلاینت زمان دریافت رشته اون رو از حالت فشرده خارج کرده و دوباره با استفاده از XML اون رو به DataTable تبدیل می کند.

این روش روش بسیار عالی و با امنیت بالایی هست. تنها مشکل سرعت کمی پایین اون هست. و همچنین کد نویسی تقریبا پیچیده.

باتشکر احسان

r0ot$harp
شنبه 29 مهر 1391, 14:10 عصر
دوستان اگر کسی هست که راه بهتری می شناسه خوشحال می شم معرفی کنه.

باتشکر احسان