سوال امنیتی (PHP)
وقتی بخواهیم اطلاعات رو از سرور بگیریم باید تبدیل کنیم به JSON بزاریم تو ی صفحه که مثل عکس زیر میشه بعد از اونجا میخونیم تو برنامه استفاده میکنیم
حالا سوال من اینه این صفحه رو ی سرور قرار میگیره اگه کسی به این صفحه دسترسی پیدا کرد همه اطلاعات رو میتونه ببینه و این اصلا خوب نیست! یا این که اینجور که من میگم نیست؟! اگه هست راه حل چیه؟!
منم قبلا این سوال برام پیش اومده بود ، لینک ، قول دادم نتیجه گرفتم پاسخ بدم و متاسفانه فراموش کردم و از این بابت عذر میخوام
خوب ، با اجازه ی دوستان بنده هم 2 روشی رو مطرح میکنم !
- روش تبادل گذرواژه ( Password Exchange )
- روش تبادل کلید (Key Exchange)
روش اول : در این روش شما یک گذرواژه تعریف میکنید مثلا "123456" حالا در هر درخواست ، این مقدار به عنوان SignKey به سرور ارسال میشه ، در سرور مطابقت داده میشه و اگه برابر بود ، پاسخ بدید !
برای امن تر کردن این روش
- کلید را به صورت String به متغییر نسبت ندهید
- کلید را در زمان اجرا ، از روی یک Sample String بسازید
به هر حال این روش از امنیت کمتری برخوردار هست
روش دوم : در این روش شما باید از یک الگوریتم "تبادل کلید" استفاده کنید ، انجام این کار ، نیازمند برنامه نویسی حرفه ای تحت وب و تحت جاوا هست ، با جست و جوی Key Exchange Algorithms به منابع خوبی میرسید که یکی از بهترین هاشون ویکی پدیاست !
تشریح عملکرد:
- یک الگوریتم واحد در سرور و کلاینت بنویسید !
- برای الگوریتم سطح ورودی تعیین کنید
- تبادل کلید رو شروع کنید !
کلاینت شما درخواست شروع دارد ، پس با یک مقدار تصادفی مثلا ساعت سیستم + یک رشته ی تصادفی 8 کارکتری را به عنوان کلید سطح یک انتخاب می کند و تابع را به این شکل فراخوانی میکند
CreateKey(myFirestLevelKey,1);
رشته ی ما الان در سطح یک کد کردن هست ، بنابراین خروجی تابع را با سطح کد کردن کردن که الان 2 هست می فرستیم به سرور ! ، این تابع سمت سرور فراخوانی میشود ،
CreateKey(mySecondLevelKey,2);
و کلاینت خروجی سرور را در سطح 2 می گیرد
در اینجا هم کلاینت و هم سرور ، الگوریتم را در سطح 3 اجرا میکنند !
CreateKey(myThirthLevelKey,3);
خروجی الگوریتم سمت سرور در بانک اطلاعاتی ذخیره می شود و به عنوان Current Key از آن استفاده می شود
خروجی الگوریتم سمت کلایت در متغییری ذخیره می شود
برای گرفتن اطلاعات ، باید این مقدار به سرور ارسال بشه و سرور با مقدار فعلی مقایسه کنه
- این الگوریتم بر حسب میزان ریسک از دست رفتن اطلاعات می تونه بارها و بارها تا سطح N ام تکرار بشه
- این الگوریتم میتونه در بازه ی زمانی مشخص ، مثلا هر بار ورود ، هفته ای یک بار ، هر روز ، هر سال ، یا فقط برای بار اول و... تجدید بشه !
این ایده ی من بود ، شما میتونید با مطالعه یک الگوریتم در سطح نیاز خودتون بنویسید ، این الگوریتم در حال تست هست ، اما در پروژه ی فعلی من پیاده شده ، ممکنه نواقصی داشته باشه ، که به چند مورد پی بردم و درحال رفع اونها هستم
در کل در زمینه ی امنیت هیچ چیز 100% امن نیست !
لطفا اگه شما هم ایده ای دارید یا باگی در الگوریتم دیدید بگید
خوب ALU جان جواب بسیار تخصصی و کاملی داد، ضمن تأیید جوابش، لازم هست بگم که معمولاً روشهای ساده هم جواب میده.
روش اول:
می تونید اطلاعات خروجی را با یک کلید با الگوریتم های امنی مثل AES ، کد گذاری کنید و در سرور Decode کنید. همین امر در سمت سرور با کد کردن خروجی و Decode شدن در اندروید می تونه همراه باشه. برای این منظور کلاس های مثل MCrypt رو در اینترنت پیدا کنید و با یک مثال ساده کد گذاری و کد گشایی رو تست کنید. در این شرایط کلید ممکنه که در Source برنامه اندروید قابل مشاهده باشه که می تونید با روش های محاسباتی Generate کنید که دیگه دیده نشه.
این روش از بالاترین نوع امنیت برخوردار هست، مخصوصاً که کلید محاسبه ای از Username کاربر یا مشخصات دستگاه متصل شونده باشه و یک کلید ثابت نباشه.
روش دوم:
معمولاً میشه Basic Authentication وب رو انجام داد. در این شرایط پسورد می تونه در Source کد برنامه اندروید دیده بشه که می تونید با روشهای محاسباتی Generate کنید. از طرفی در این روش میشه با Sniff کردن Packet خروجی بدون دونستن پسورد Header رو جعل کرد.
روش سوم:
می تونید پس از ورود کاربر، در بانک بگونه ای تغییر حاصل کنید که به این کاربر یک Token اختصاص داده بشه، دفعه های بعد تنها Token رد و بدل میشه و نه User , Password که در این شرایط تنها خروجی صفحه Login شما قابل مشاهده است و نه خروجی باقی صفحات. دقت داشته باشید که این Token می تونه پس از زمان خاصی از Table حذف بشه. Token توسط کسی که وارد هست خیلی راحت پیدا میشه.
روشهای دیگری هم هست که به علت امنیت ضعیف تر از گفتنش صرف نظر می کنم.
در هر حال پیاده سازی هر یک از روشهای فوق نیازمند دانش قوی دوسویه شما در Java و PHP است. اما من روش اول را پیشنهاد می کنم، برای بار اول کمی سخت اما روشی پایدار و امن هست.
با سلام
از دوستان خواهش می کنم اگه امکان داره یک Sample ساده از روش های گفته شده بذارن تا این تاپیک پر بارتر بشه
باتشکر
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .
