آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

سوال امنیتی (PHP)

Mir Unknown  12 سال پیش  10 سال پیش
+19 0

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

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

0 0
چیزی که در مرحله اول به ذهنم میرسه ایه که اول باید ببینیم کدهای پی اچی پی شما چی هستن. دوما هم اینکه میتونی توی پی اچ پی درخواست کننده اطلاعات رو اعتبار سنجی کنی و بعد بهش اطلاعات رو بدی. مثلا با یه رمز عبور که از اندروید به وب سرور ارسال بشه و اگه درست بود اطلاعات رو بده. راههای دیگه با امنیت بالاتری هم وجود داره که به نظرم برای کارهای معمولی نیازی بهش نیست. (12 سال پیش)
0 0
شاید کار معمولی نیست! راهش چیه؟ (12 سال پیش)
+3 0
راه حل ربطی به اینکه سرور شما چیه و کلاینت چی نداره. شما ارتباط امنی بین یه وب سرویس و یه کلاینت میخوای ایجاد کنی : لینک پیاده سازیش ممکنه برای php متفاوت باشه ولی اصول غیر از موارد مختص asp.nte/c# همینه (12 سال پیش)
0 0
آقای egoldashraf شما قبلا کجا بودید ؟!! ، خیلی خوشحالم که فعالیت می کنید و پاسخ های مفیدی میدید ، به شخصه خیلی از پاسخ هاتون چیز یاد گرفتم ، لطفا به فعالیتتون ادامه بدید (12 سال پیش)
0 0
ولا بدرد من ک نخورد لینکه انگلیسیه منم ک انگلیسیم 0 (12 سال پیش)
0 0
صبر کنید ، در حال درج پاسخ هستم (12 سال پیش)
+1 0
من هم مشترک سئوال میشم ( برای مقاصد تست پیام ها ) :) (12 سال پیش)
0 0
استاد اگه وقت کردید جواب پیامی ک دادم بدهید کارم گیره (12 سال پیش)
0 0
اگر ALU جان جواب خوبی نداد، من می نویسم. (12 سال پیش)
0 0
استاد لطفا شما هم پاسخ بدید ، من خودم در این زمینه خیلی ضعیف هستم (12 سال پیش)
0 0
استاد منظورم این سوال نبود سوالی بود که پیام خصوصی کردم (12 سال پیش)
+2 0
به سئوالتون در لینک لینک پاسخ داده شد، نیاز بود آموزشها را با دقت بیشتری مطالعه می کردید. (12 سال پیش)
0 0
جدای اینکه میتونیم قبل از فرستادن Json از طرق مختلف کاربر را شناسایی کنیم ؛ میتونیم متن Json را هم به صورت کد شده ارسال و دریافت کنیم و بعد از باز کردن کد آن را بخوانیم (12 سال پیش)
0 0
MiRHaDi لینک اموزشی چیزی اگه دارید بدید ممنون میشم (12 سال پیش)
0 0
سلام میرجون منم این سوالو داشتم و خب واسه خودم از یه گذرواژه استفاده کردم که تو ورودی پارامترها میخواد و اگه درست نباشه کاریو انجام نمیده (11 سال پیش)
 برای این سوال 3 پاسخ وجود دارد.
پاسخ به سوال 
مجتبی یگانه  12 سال پیش
+11 0

 منم قبلا این سوال برام پیش اومده بود ، لینک ، قول دادم نتیجه گرفتم پاسخ بدم و متاسفانه فراموش کردم و از این بابت عذر میخوام

خوب ، با اجازه ی دوستان بنده هم 2 روشی رو مطرح میکنم !

  1. روش تبادل گذرواژه ( Password Exchange )
  2. روش تبادل کلید (Key Exchange)

روش اول : در این روش شما یک گذرواژه تعریف میکنید مثلا "123456" حالا در هر درخواست ، این مقدار به عنوان SignKey به سرور ارسال میشه ، در سرور مطابقت داده میشه و اگه برابر بود ، پاسخ بدید !

برای امن تر کردن این روش

  1. کلید را به صورت String به متغییر نسبت ندهید
  2. کلید را در زمان اجرا ، از روی یک Sample String بسازید
    به هر حال این روش از امنیت کمتری برخوردار هست 

روش دوم : در این روش شما باید از یک الگوریتم  "تبادل کلید" استفاده کنید ، انجام این کار ، نیازمند برنامه نویسی حرفه ای تحت وب و تحت جاوا هست  ، با جست و جوی Key Exchange Algorithms به منابع خوبی میرسید که یکی از بهترین هاشون ویکی پدیاست !

تشریح عملکرد:

  1. یک الگوریتم واحد در سرور و کلاینت بنویسید !
  2. برای الگوریتم سطح ورودی تعیین کنید
  3. تبادل کلید رو شروع کنید !

کلاینت شما درخواست شروع دارد ، پس با یک مقدار تصادفی مثلا ساعت سیستم + یک رشته ی تصادفی 8 کارکتری را به عنوان کلید سطح یک انتخاب می کند و  تابع را به این شکل فراخوانی میکند

CreateKey(myFirestLevelKey,1);

رشته ی ما الان در سطح یک کد کردن هست  ، بنابراین خروجی تابع را با سطح کد کردن کردن که الان 2 هست می فرستیم به سرور ! ، این تابع سمت سرور فراخوانی میشود ، 

CreateKey(mySecondLevelKey,2);

و کلاینت خروجی سرور را در سطح 2 می گیرد
در اینجا هم کلاینت و هم سرور ، الگوریتم را در سطح 3 اجرا میکنند !

CreateKey(myThirthLevelKey,3);

 خروجی الگوریتم سمت سرور در بانک اطلاعاتی ذخیره می شود و به عنوان Current Key از آن استفاده می شود
خروجی الگوریتم سمت کلایت در متغییری ذخیره می شود

برای گرفتن اطلاعات ، باید این مقدار به سرور ارسال بشه و سرور با مقدار فعلی مقایسه کنه

  1. این الگوریتم بر حسب میزان ریسک از دست رفتن اطلاعات می تونه  بارها و بارها تا سطح N ام تکرار بشه
  2. این الگوریتم میتونه در بازه ی زمانی مشخص ، مثلا هر بار ورود ، هفته ای یک بار ، هر روز ، هر سال ، یا فقط برای بار اول و... تجدید بشه !

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

در کل در زمینه ی امنیت هیچ چیز 100% امن نیست !

لطفا اگه شما هم ایده ای دارید  یا باگی در الگوریتم دیدید بگید

0 0
شما sample یا چیزی به این شکل دارید که لطف کنید و در اختیارمون قرار بدید؟ (11 سال پیش)
0 0
متاسفانه روش گفته شده در پروژه ای پیاده شده و انتشار سورس کدش مقدور نیست. (11 سال پیش)
پاسخ به سوال 
uncocoder  12 سال پیش
+17 0

خوب 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 است. اما من روش اول را پیشنهاد می کنم، برای بار اول کمی سخت اما روشی پایدار و امن هست.

0 0
استاد خیلی ممنون که پاسخ دادید ، خیلی برای من مفید بود ، در مورد روش اول ، اگه درست متوجه شده باشم ، فقط یک مقدار کد شده ارسال و دریافت میشه که بعد از Decode به آرایه ای از مقادیر تبدیل میشه ، و تعیین هویت و شناسایی هم از طریق یک signkey که در همین آرایه هست صورت میگیره ، آیا درست متوجه شدم ؟ (12 سال پیش)
+1 0
بله دقیقاً. در روش کد گذاری AES مخصوصاً اگر Key داینامیک باشه، غیر قابل نفوذ هست چون هیچ وقت یک کلید ثابت وجود نداره. این داینامیک بودن هم می تونه از طریق یک معیار مشخص مثل IMEI یا Username یا حتی Password انجام بشه که در نهایت نفوذ کننده خیلی باید تخیل گرا باشه که فکر کنه می تونه نفوذ کنه. (12 سال پیش)
+1 0
تو روش اول چطور generate کنیم که مشخص نشه؟ بازم هرکاری کنیم طرف میفهمه که مثلا فلان متغییر رو فلان کار کردیم! (12 سال پیش)
+3 0
معمولاً الگوریتم های ریاضی، Trace کردنشون سخته. همینطور می تونید با یک سری محاسبات اعشاری مثل لگاریتم و ... کار کنید، عملاً اینقدر گیج کننده میشه برای هکر که بی خیالش میشه. همینطور می تونید از یک پترن خاص باینری، حروفی رو که در یک سلسله از اعداد وجود دارن، جدا کنید و مثلاً 16 تا سلسله عدد باعث تولید شدن کد میشه. همین پترن که از توش عدد انتخاب شد رو هم می تونید بفرستید سمت سرور و با همون الگوریتم از همون پترن سمت سرور 16 تا عدد انتخاب بشه. توجه داشته باشید که معمولاً هکر ها از OPCODE برای شناسایی دستورات استفاده می کنند و چیزهایی که Jump زیادی داره ( مثل حلقه های For و If های تو در تو و Method Call ) و همینطور الگوریتم هایی که با داده های بزرگ مثل Double کار می کنن، باعث گیج شدن هکر ها میشه. نکته ی دیگر اینکه وقتی از هکر صحبت می کنیم یعنی کسی که هک کردن محصول براش بصرفه که مثلاً شاید Windows باشه یا 3D Studio Max وگرنه یک برنامه حتی کولاک اندروید که دیگه این حرفا رو نداره. نهایتاً سمت سرور اگر فهمیدید کسی دسترسی غیر مجاز پیدا کرده، یوزر و IP ش رو Ban می کنید و در نهایت یک کد Ban کننده اتوماتیک هم براش می نویسید. (12 سال پیش)
0 0
ممنون . گرفتم ;) (12 سال پیش)
0 0
استاد البته همیشه اونطور که ما فکر می کنیم ، هکر نمیاد بشینه خط به خط Trace کنه ! ، هکر هم برنامه نویسه ، پس میتونه با خوندن ورودی و الگوریتم ، الگوریتم مشابهی بنویسه ، خروجی بگیره و اطلاعات پایگاه داده رو بدست بیاره ، البته تا اینجا هم خطر چندانی نداره ، چون ما تقریبا داریم همون اطلاعات را در برنامه بهش میدیم ، مگر اینکه برنامه ی ما با اطلاعات محرمانه ، مالی و مهمی سر و کار داشته باشه ، که در این صورت من ترجیح میدم از الگوریتم تبادل کلید خودم استفاده کنم ! ، اما ممنون ، ایده های خیلی خوبی دادید (12 سال پیش)
+1 0
خوب اگر بحث AES باشه و Key هم در سورس کد مشخص نباشه، هکر هیچ راهی نداره، جز Trace خط به خط. چون کلید در خروجی دیده نمیشه و فقط دیتا Encrypt شده هست. (12 سال پیش)
+1 0
سلام استاد توانستید این را هم به مجموعه آموزشهاتون اضافه کنید (12 سال پیش)
0 0
چجوری کد رو با روش محاسباتی generate کنیم؟ مثلا دقیقا میشه همین تیکه کد رو از apk دراورد Double dd = (495 / (1.0324 - 0.19077 * (Math.log10(76.2 - 25.4)) + 0.15456 * (Math.log10(170.18))) - 450); (11 سال پیش)
0 0
توضیحات زیاد و خوب بودولی هر عمل عکس والعملی دارد :D (11 سال پیش)
پاسخ به سوال 
MOJTABA  10 سال پیش
+2 0

با سلام

از دوستان خواهش می کنم اگه امکان داره یک Sample ساده از روش های گفته شده بذارن تا این تاپیک پر بارتر بشه

باتشکر


پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .