مشاهده نسخه کامل
: تنظیم کانکشن استرینگ بعد از کامپایل با حفظ امنیت
Payman_62
25-09-2009, 16:01
سلام.
میخوام با استفاده از روشی کانکشن استرینگ رو بعد از کامپایل برنامه ست کنم. تا مجبور نشم هر سری دوباره برنامه رو کامپایل کنم و ستاپ بسازم.
روش هایی مثل تنظیم در setting یا خوندن از app.config بعد از تغییر سرور نیاز به کامپایل مجدد دارن.
من میخواستم از فایل های udl استفاده کنم. ولی udl هم امنیت بالایی نداره و کاربر اگه دستکاریش کنه ارتباط با سرور قطع میشه. اما امنیت برای من خیلی مهمه.
جایی خوندم میشه فایل های udl رو از دسترسی غیر مجاز حفظ کرد. کسی اطلاعی داره؟
در کل چه روشی رو پیشنهاد میکنید؟
میخوام با استفاده از روشی کانکشن استرینگ رو بعد از کامپایل برنامه ست کنم. تا مجبور نشم هر سری دوباره برنامه رو کامپایل کنم و ستاپ بسازم
یعنی شما Connection string برنامه رو تو یک خط ثابت مینویسید و هر وقت بخواید تغییر بدید باید سورس رو عوض کنید؟
دقیقا نمیدونم میخواهید چکار کنید ولی من خودم از یه کلاس برای بدست آوردن Connection string استفاده میکنم
چندین پارامتر میگیره و بر اساس اون Connection string رو میسازه و دستورات مربوطه جهت اتصال از اون استفاده میکنن
اگر هم بعضی شرایط سرور و شبکه تغییر کرد مشکلی پیش نماد چون کلاس مربوطه با شرایط جدید دستور جدید میسازه
اگر منظور شما چیز دیگه ای هستش لطفا توضیح بدید
Payman_62
26-09-2009, 17:10
سلام.
وقتی نام و آدرس سرور تغییر میکنه کلاس شما چطور کانکشن جدید رو میسازه؟ یعنی چطور نام سرور رو گیر میاره؟ بالاخره باید از جایی از بیرون بهش داده بشه.
shalineh
26-09-2009, 19:28
میتونی تمام پارامترهای لازم برای کانکشن استرینگ رو در یک فایل تکست معمولی بریزی ( بصورت کد شده ) و سپس در هنگام لود برنامه ، این فایل رو بخونی و پارامترها رو در کانکشن استرینگ وارد کنی.
کاری که من در برنامه شهر شکلک کردم و اونو در یک فایل تکست کد شده و در یک جای مخفی قرار دادم.
فقط کافیه این تکست رو تغییر بدم و دیگه نیاز به کامپایل نداره.
Payman_62
26-09-2009, 20:46
سلام.
فایل udl برای همین کار هست که گرفتن اطلاعات سرور و دیتابیس رو کپسوله کرده.
اما مشکل من عدم امنیت این فایل هست. به راحتی قابل ویرایش هست و در صورت تغییر محتوای فایل ارتباط با سرور قطع میشه.
وقتی نام و آدرس سرور تغییر میکنه کلاس شما چطور کانکشن جدید رو میسازه؟ یعنی چطور نام سرور رو گیر میاره؟ بالاخره باید از جایی از بیرون بهش داده بشه.
موقع ورود به نرم افزار فرم LogIn میاد و اونجا اطلاعات مورد نیاز توش هست
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
اطلاعات log in رو هم تو یه فایل ذخیره میکنیم اگر می خواید کسی متوجه اون فایل نشه پسوند اونو عوض کنید مثلا Info.dll
برنامه هیچ مشکلی با خوندن یا نوشتن توش نداره و کاربر متوجه نمیشه که این فایل یک dll نیست
مثلا من قبلا برای برنامه های بانک اطلاعاتی اکسس بخاطر اینکه کسی ندونه بانکم کدونه نام فایل رو از DB.mdb به DB.dll تغییر میدادم و فایل شکل dll به خوش میگرفت و برنامه هم بدون هیچ مشکلی کار میکرد
shalineh
27-09-2009, 12:54
سلام.
فایل udl برای همین کار هست که گرفتن اطلاعات سرور و دیتابیس رو کپسوله کرده.
اما مشکل من عدم امنیت این فایل هست. به راحتی قابل ویرایش هست و در صورت تغییر محتوای فایل ارتباط با سرور قطع میشه.
فکر نکنم راهی داشته باشد. چون ویرایش کردن یک فایل کار چندان مشکلی نخواهد بود. حتی اگر یک فایل در تمام مدت روشن بودن سیستم ، در حال استفاده توسط برنامه یا سیستم باشد.
من دقیقا متوجه نشدم. آیا منبع دیتای شما ثابت است؟ ( Path ) یا متغیر است؟
برنامه شما تک کاربره است یا مولتی یوزر؟ اگر اطلاعات دیتا و سرور توسط کاربر تغییر کنه چه اتفاقی برای برنامه یا هدف شما می افته؟
اینها سوالاتی است که باید پاسخ داده شود. اونوقت بهتر میشه هدف شما را ارزیابی کرد وراهنمایی کرد .
در ضمن یک فایل کد شده رو کاربر چگونه میخواهد بصورت صحیح دستکاری کند در حالیکه چیزی از محتویات فایل سر در نمی آورد؟!!!
مگر اینکه عملیات خرابکارانه داشته باشد. که این هم در برنامه های سینگل یوزر معنا ندارد.
به هر حال بهتر است کمی موضوع رو بازتر کنید.
shalineh
27-09-2009, 13:03
یه چیزه دیگه:
کالا در هر برنامه ای ، حتما قبل از استفاده از یک فایل خارجی ، باید محتویات اون بررسی بشه و ببینیم که آیا فرمت آن و همچنین مقادیر و پارامترهای آن با قوانین برنامه ما و نوع متغیرهای ما سازگاری دارد یا نه؟ اگر نه که ، باید پیام مناسبی به کاربر داده شود.
Payman_62
27-09-2009, 16:26
سلام.
موقع ورود به نرم افزار فرم LogIn میاد و اونجا اطلاعات مورد نیاز توش هست
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
اطلاعات log in رو هم تو یه فایل ذخیره میکنیم اگر می خواید کسی متوجه اون فایل نشه پسوند اونو عوض کنید مثلا Info.dll
برنامه هیچ مشکلی با خوندن یا نوشتن توش نداره و کاربر متوجه نمیشه که این فایل یک dll نیست
مثلا من قبلا برای برنامه های بانک اطلاعاتی اکسس بخاطر اینکه کسی ندونه بانکم کدونه نام فایل رو از DB.mdb به DB.dll تغییر میدادم و فایل شکل dll به خوش میگرفت و برنامه هم بدون هیچ مشکلی کار میکرد
مشکل من اینه که کاربر اصلا با برنامه ارتباط نداره. برنامه به صورت سرویس ران میشه و پشت پرده کاراش رو میکنه و تا میتونه باید کارش رو مخفیانه انجام بده. فرم یوزر و پس برای کاربر ظاهر نمیشه. البته میشه مثلا هنگام نصب آدرس سرور رو بگیره. ولی میخوام ببینم روش مناسب تری کسی بلده؟
امنیت برنامه هم باید خیلی بالا باشه. طوری که حتی کاربر نتونه برنامه رو ببنده. اینه که باید رو ارتباط با سرور هم دقت زیادی کنم.
فکر نکنم راهی داشته باشد. چون ویرایش کردن یک فایل کار چندان مشکلی نخواهد بود. حتی اگر یک فایل در تمام مدت روشن بودن سیستم ، در حال استفاده توسط برنامه یا سیستم باشد.
من دقیقا متوجه نشدم. آیا منبع دیتای شما ثابت است؟ ( Path ) یا متغیر است؟
برنامه شما تک کاربره است یا مولتی یوزر؟ اگر اطلاعات دیتا و سرور توسط کاربر تغییر کنه چه اتفاقی برای برنامه یا هدف شما می افته؟
اینها سوالاتی است که باید پاسخ داده شود. اونوقت بهتر میشه هدف شما را ارزیابی کرد وراهنمایی کرد .
در ضمن یک فایل کد شده رو کاربر چگونه میخواهد بصورت صحیح دستکاری کند در حالیکه چیزی از محتویات فایل سر در نمی آورد؟!!!
مگر اینکه عملیات خرابکارانه داشته باشد. که این هم در برنامه های سینگل یوزر معنا ندارد.
به هر حال بهتر است کمی موضوع رو بازتر کنید.
فکر نمیکنم این جزییات مهم باشه. برنامه به صورت کلاینت سروری هست که نسخه سرور رو سرور و کلاینت هم روی کلاینت ها نصب میشه.
من میخوام از دست کاری تو کارکرد برنامه توسط کاربران جلوگیری کنم. مثلا محتویات udl رو ادیت نکنن و برنامه ارتباطش با سرور قطع بشه.
البته در حضور دوستان جسارت نباشه خوب چرا می خواهید کانکشن رو در یک فایل ذخیره کنید خوب می تونید در هر بار اجرای برنامه به صورت خودکار نام سرور و نام دیتابیس رو پیدا کنید و کانکشن رو ست کنید.برای پیدا کردن نام دیتابیس هم از sp_helpdb استفاده کنید.
سلام
من یک نمونه کد دارم که شاید کمک کند ...
در این کد بسیار بسیار ساده برای ذخیره از Settings های خود پروژه استفاده شده ولی قبل از ذخیره سازی و بعد از خواندن فقط به صورت نمادین اطلاعات با ------ مثلاً رمزنگاری شده.
اگر از کدی شبیه همین و با کلاسهای اصلی دات نت برای رمزنگاری در فضای System.Security.Cryptography استفاده کرد، گمانم خوب باشد.
بحرحال رمزنگاری را میخواهد چون اطلاعات ConnectionString حاوی user و Pass است که مواردی امنیتی است ولی اگر Settings را هم نخواهید میتوانید در قالب یک فایل با هر پسوندی در کنار برنامه هم ذخیره کنید (bin.* یا dat.* و...)
نمونه کد:
support.h02.ir/fwlink/?LinkId=1001372507
تاپیک مرتبط:
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
مشکل من اینه که کاربر اصلا با برنامه ارتباط نداره. برنامه به صورت سرویس ران میشه و پشت پرده کاراش رو میکنه و تا میتونه باید کارش رو مخفیانه انجام بده. فرم یوزر و پس برای کاربر ظاهر نمیشه. البته میشه مثلا هنگام نصب آدرس سرور رو بگیره. ولی میخوام ببینم روش مناسب تری کسی بلده؟
خود سرویسها هم میتونن اطلاعات ورودی بگیرند شما میتونید همون اطلاعات log in رو تو properties همون سرویس قرار بدید
اگه به تصویر زیر دقت کنید سرویسها توانایی لازم رو دارن
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
سلام
میبخشید، من کل تاپیک را مطالعه نکرده بودم و حالا که کاربر MTPROG پست قبلی را دادند متوجه این شدم ...
مشکل من اینه که کاربر اصلا با برنامه ارتباط نداره. برنامه به صورت سرویس ران میشه و پشت پرده کاراش رو میکنه و تا میتونه باید کارش رو مخفیانه انجام بده. فرم یوزر و پس برای کاربر ظاهر نمیشه. البته میشه مثلا هنگام نصب آدرس سرور رو بگیره. ولی میخوام ببینم روش مناسب تری کسی بلده؟
اگر اینطور است شاید بد نباشد برنامه و سرویس شما مقدار ConnectionString رمزنگاری شده را از محل مشخص و خواصی بخواند (مثل یک مقدار در رجیستری) سپس یک برنامه کمک فرمدار و با UI هم برای پیکر بندی برنامه در کنار این ویندوز سرویس وجود داشته باشد.
بالاخره شما اغلب برنامه های خدماتی کلی را که میبینید ویندوز سرویس دارند یک برنامه UI دار برای تنظیمات هم دارند، چه ضد ویروسها و چه خود SQLServer و...
(خود SQLServer ابزار نمایشی و مرتبط با کاربری مثل SQL Server Configuration Manager و SQL Server Surface Area Configuration را دارد.
که در واقع ساپورت تنظیمی سرویسهایش را انجام میدهند و حتی برخی تغییرات تنظیمی با Restart سرویس یا Start بعدی آن اعمال میشود و همان لحظه اثر نمیکند.
نتیجتاً پیشنهاد من قرار دادن امکان edit و تغییر ان محل مشخص ConnectionString درون یک برنامه خدماتی فرمدار مرتبط با سرویستان است. این برنامه لزوماً نیاز نیست همیشه در RAM و در حال اجرا باشد و همیشه هم جلوی چشم باشد.
(
برخی از ابزار خدماتی SQLServer اصلاً Shortcut اش هم در منوی Start وجود ندارد و باید دستی به پوشه مورد نظر بروید و اجرایشان کنید که دیگر اجرا بودن در RAM و وجود Shortcut در منوی Start و... به صلاح دید برنامه نویس و شرایط اجرای آن بستگی دارد.
)
Payman_62
30-09-2009, 22:20
سلام.
تشکر از نظرات مفیدتون.
جناب MTPROG عکسی که شما گذاشتی مربوط به ران شدن سرویس به صورت عادی یا از طریق یه یوزر خاص هست. اما اگه منظورتون اینترکتیو بودنش هست بله برنامه بنده به صورت اینترکتیو هست. اما این که بخوام از کاربر کانکشن استرینگ رو بگیرم روش مناسبی نیست. پایین توضیح میدم.
جناب h2 تو فکر یه همچین روشی بودم که اطلاعات دفعه اول ران شدن از ادمین گرفته بشه و جایی ذخیره بشه. احتیاجی هم به برنامه کمکی نداره. چون نیازی نیست اطلاعات ادیت بشه. به 2 دلیل. اول این که آدرس سرور ثابته و نیازی به ادیت نداره. دوم این که ممکنه کاربران عادی از امکان ادیت کانکشن استرینگ سو استفاده کنند ( حتی اگه پسورد و ... هم در نظر گرفته بشه ) و برنامه به مشکل بر بخوره.
سالی 1 بار هم نیاز به ادیت کانکشن استرینگ نیست. اگر بود برنامه پاک و دوباره نصب میشه تا مطمن باشم 100% توسط مسوول پشتیبانی انجام میشه نه خود کاربر.
vBulletin , Copyright ©2000-2025, Jelsoft Enterprises Ltd.