PDA

View Full Version : امنیت در بازی های آنلاین



poorman
پنج شنبه 21 خرداد 1394, 19:17 عصر
سلام به همه دوستان عزیز

بنده به تازگی وارد حیطه بازی سازی شدم و در حال حاضر دارم روی یک پروژه آنلاین کار میکنم (موبایل)
خب از اونجایی که توی بازی آنلاین امنیت مهمه کم کم دارم به فکرش میفتم که برم سمتش
نکته مهم اینه که تخصص زیادی توی php ندارم و یک مبتدی محسوب میشم
ارتباطات درون بازی کاملا با وب سرویس انجام میشه

توی تقریبا یک ساعتی که سرچ زدم به مباحث جالبی رسیدم مثل sql injection و امنیت آپلود که باعث شد مخم سوت بکشه، چون توی تخیلاتم هم فکرم به اینجاها نمیرسید
خب php خیلی گسترده ست و من هم اول راه، کشف تمام اینا زمان زیادی میبره

خواستم ببینم شما عزیزان تجربه ای توی این زمینه دارید؟ یا فکر میکنید بیشتر با چه چیزهایی درگیر میشم در آینده؟

یک مثال ساده میزنم، در حال حاضر یک بازی منتشر کردیم که تنها کارش ثبت رکورد بازیکن هست
حالا هر کسی و حتی خود بازیکن میتونه با فهمیدن آدرس وب سرویس هر رکوردی که خواست رو بفرسته!!!
برای جلوگیری از این حالت باید چکار کرد؟

پروژه جدیدی که دارم روش کار میکنم خیلی گسترده تر از این حرفاست و شامل حمله کردن به سایر بازیکن ها میشه که مسلما نباید کسی بتونه 1000 بار پشت سر هم به یکی حمله کنه و نتونه اطلاعات حیاتی بازیکنای دیگه رو ببینه

بسیار بسیار ممنون میشم حتی اگر کوچکترین توصیه ای دارید دریغ نکنید :لبخندساده:

fatima-php
پنج شنبه 21 خرداد 1394, 21:12 عصر
میتونید هربار که کاربر وارد بازی میشه، یک کلید اختصاصی از سرور بهش بدین و اطلاعات رو تا زمانی که از بازی خارج نشده و دوباره وارد بازی نشده (Activity بسته نشده)، با الگوریتمهای خاصی مثل AES با همون کلید اختصاصی مبادله کنید. اینطوری بدون فهمیدن اون کلید نمیتونن کاری از پیش ببرن و ازطرفی کلید هم توی بازی دریافت میشه. به محض خروج از بازی (و ورود مجدد) هم کلید جدید تولید میشه.

poorman
پنج شنبه 21 خرداد 1394, 21:18 عصر
راه حل خوبیه، یعنی کار رو یکم سخت تر میکنه ولی بازم دور زدنش ساده ست
اگه قرار باشه یک کلید به کاربر داده بشه، این کار باید از طریق یه وب سرویس باشه دیگه؟
با فهمیدن اون وب سرویس هکر میتونه هرچقدر خواست کلید بگیره و کارشو انجام بده

fatima-php
پنج شنبه 21 خرداد 1394, 21:22 عصر
نه دیگه به این سادگی هم نیست. میتونید کلید رو سخت تر کنید. برای مثال:
1- یک کلید عمومی دارین که توی برنامه شما Hard Code شده و جایی مبادله نمیشه و داده ها در درخواستهای اولیه تا قبل از گرفتن کلید اختصاصی، با اون کلید مبادله میشن.
2- بعد از گرفتن کلید خصوصی، اطلاعات با کلید خصوصی رمزگذاری و مبادله میشن.

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

poorman
پنج شنبه 21 خرداد 1394, 21:38 عصر
آره آدرس وب سرویس قرار نیست به این سادگی لو بره

ولی خب ذهنیت من این بود که شاید ابزارهایی برای رصد ارتباطات یک برنامه باشه و وب سرویس فهمیده بشه!!! ( حالا اینو نمیدونم تا چه حد امکان پذیره )

fatima-php
پنج شنبه 21 خرداد 1394, 21:44 عصر
راستش مطمئن نیستم چنین برنامه هایی باشه ولی فرضاً اگه باشه هم فقط آدرس وب سرویس رو دارن و چون کلید عمومی و خصوصی رو نمیدونن (کلید خصوصی هم با همون کلید عمومی بصورت رمزگذاری شده ازطریق شبکه ارسال میشه)، حتی اگه شنودی هم در کار باشه، اطلاعات بدرد بخوری عایدشون نمیشه. در این مورد خاص فکر میکنم وب سرویسهای WSDL امنیت بیشتری نسبت به REST فراهم کنن. میتونید یکسری اطلاعات خاص گوشی مثل IMEI و... رو هم ازطریق نرم افزار بگیرین و جزو اطلاعات احراز هویت برای سرور بفرستین. اینطوری حتی میشه فهمید از یه اکانت توی چند تا گوشی داره استفاده میشه.

poorman
پنج شنبه 21 خرداد 1394, 21:51 عصر
آره باید این پروسه طوری پیچیده بشه که نشه به راحتی کلید عمومی و خصوصی رو گیر اورد

متاسفانه توی گوشی های اندروید تا جایی که اطلاع دارم نمیشه یک IMEI منحصر بفرد که با تغییر سیستم عامل ثابت بمونه پیدا کرد

از سایر دوستان هم میخوام اگر تجربیاتی در رابطه بازی آنلاین دارن یا فک میکنن اشکالات خاصی این سیستم ها داره، لطف کنن بگن

fatima-php
پنج شنبه 21 خرداد 1394, 22:02 عصر
فکر نمیکنم اینطوری باشه. IMEI سخت افزاریه تا جایی که اطلاع دارم و ربطی به سیستم عامل نداره. شاید هم من اشتباه میکنم.

c0mmander
دوشنبه 25 خرداد 1394, 14:18 عصر
فکر نمیکنم اینطوری باشه. IMEI سخت افزاریه تا جایی که اطلاع دارم و ربطی به سیستم عامل نداره. شاید هم من اشتباه میکنم.

IMEI بسته به شبکه ارتباطی موبایل داره یعنی تبلت هایی که سیم کارت نمیخورن این شماره رو ندارند.


ولی خب ذهنیت من این بود که شاید ابزارهایی برای رصد ارتباطات یک برنامه باشه و وب سرویس فهمیده بشه!!! ( حالا اینو نمیدونم تا چه حد امکان پذیره )

به این صورت نیست اما ابزار های اسنیفر وجود داره.اما بهترین کار استفاده از پروتکل ها ssl هست و یا استفاده از https ...


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

این روش زیاد توصیه نمیشه (البته من تجربه عملی در پیاده سازی سایتی با ایمنی 100 در 100 رو ندارم) همیشه سخت ترین راه ها بهترین راه ها نیستند اما به نظر من راحت ترین و بهترین راه اهراز هویت یوزر نیم و پسورد هست که پسورد بصورت هش شده داخل سرور نگه داری میشه و هر بار کانتکت شدن کلاینت اون رو بررسی میکنه(یعنی اینکه وب سرویس پسورد رو مجددا هش میکنه و با دیتا بیس مقایسه میکنه).


آره باید این پروسه طوری پیچیده بشه که نشه به راحتی کلید عمومی و خصوصی رو گیر اورد

کلید ها رو زمان دار در نظر بگیری بهتره.

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

poorman
دوشنبه 25 خرداد 1394, 16:20 عصر
کلید ها رو زمان دار در نظر بگیری بهتری.

مرسی امیر جان

کلید ها رو باید بررسی کنم ببینم میتونم زمان دار در نظر بگیرم یا نه
یکی از چیزایی که بهش فکر نکردیم هنوز اینه که آیا چند تا کاربر میتونن با یه اکانت بازی کنن یا نه

اگه قرار باشه چند تا کاربر بتونن با یک اکانت بازی کنن، اینطوری دیگه کلیدها رو سخت میشه تغییر داد و هماهنگ کرد


یک جمله دیگه هست که میگن: "هر چی پیچیدگی بالا بره باگ های قابل استفاده هم 10 ها بار فراوان تره."

آره پیچیدگی اصلا خوب نیست
الان معلوم بود واسه راحتی خودم اینو گفتم؟ :لبخند::بامزه:

c0mmander
دوشنبه 25 خرداد 1394, 17:35 عصر
من قبل از هر چیزی این رو بگم که نرم افزار هایپکیج مانتورینگ یا فایروال ها و غیر ... میتون شبکه رو مورد تحلیل قرار بدن که البته برنامه نویسی اون ها برای یک متخصص یا دوستان غیر سازنده ما بصورت کاستومایز شده کار زیاد سختی نیست. ابزار های اسنیفری طرز کارشون فرق میکنه و برای به دست اوردن ادرس هایی که در یک سیستم ارسال میشن کارایی نداره. دیگه همین جا اصلاح کردم دیگه:اشتباه:


کلید ها رو باید بررسی کنم ببینم میتونم زمان دار در نظر بگیرم یا نه
یکی از چیزایی که بهش فکر نکردیم هنوز اینه که آیا چند تا کاربر میتونن با یه اکانت بازی کنن یا نه


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

دوستان در بحث مشارکت کنند. و ایده ها و راهکار ها رو به اشتراک بگذارید.

poorman
دوشنبه 25 خرداد 1394, 18:16 عصر
آره درست میگی حالا که فکر میکنم میبینم کلا کار درستی نیست توی این سیستم چند کاربر با یک اکانت
آخرش نتیجه خوبی در بر نداره

این زمان دار بودن کلید ها رو باید یکم روی روندش کار کنم

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

برای کلید اختصاصی، دو تا راه وجود داره که شاید دومی بهتره :لبخند:
اول اینکه کلید زمان دار تولید بشه به کلاینت داده بشه، بعد به مدت 10 دقیقه از اون کلید استفاده کنه تا زمانی که سرور بگه منقضی شده، بعد دوباره کلید جدید از سرور بگیره
دوم اینکه هر بار که با سرور ارتباط برقرار میکنه یک کلید زمان دار جدید بگیره
این برای کلید اختصاصی

برای کلید عمومی چکار کنم؟
کلید عمومی، اینو ثابت ذخیره کنم یا تغییرش بدم هر سری؟؟؟
این کلید عمومی که موقع ثبت نام بهش داده شده در لاگین بعدی کاربر اعتبار داره؟ یا بهتره عوض بشه؟

اگر عوض بشه، باز برای گرفتن این کلید لازمه که یوزرنیم و پسوورد کاربر هر دو ذخیره بشن سمت کلاینت تا بشه بهش کلید عمومی داد
اینطوری چطوری میشه؟؟؟!!!

c0mmander
سه شنبه 26 خرداد 1394, 09:12 صبح
استفاده تنها از کلید عمومی تولید شده برای برنامه جهت اهراز هویت کار درستی نیست بهتره برنامه هربار یوزر نیم و پسورد رو هم بفرسته تا اینجوری بروتفروس شدن دیگه خیلی کمرنگ بشه.

باید دلیل استفاده از هر کلید رو مشخص کنی مثلا قرار کلید عمومی به چه دلیل به برنامه داده بشه و چه کاری رو انجام بده.

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

با این تفاسیر متغییر بودن کلید عمومی که بعد از ثبت نام به برنامه داده میشه دلیل موجهی نداره. یا حد اقل من دلیلش رو نمیفهمم.

روش پیشنهادی من روش زیره:


1- بازی اندروید: ارسال یورز و پسورد جهت ثبت نام
2- سرور :تکمیل پرورسه ثبت نامه و صادر شدن یک کلید عمومی برای ثبت نام کننده (کلید عمومی به کاربر داده نمیشد)
3- بازی اندروید: ثبت نام کننده برای اولین بار وارد بازی میشود (ذخیره شدن یوز و پس برای لاگین های خودکار بعدی )
4- سرور :سرور کلید عمومی را بعد از لاگین شدن به کاربر میدند (این کد کلید تنها برای گرفتن کد اختصاصی به کار میرود)
5-بازی اندروید : بازیکن بر روی آغاز بازی دکمه کرده و منتظر لود شدن بازی است.(در صورتی که هنوز لاگین کاربر اعتبار داشته باشد کلید عمومی به همراه یوزر و پسورد به سرور فرستاده میشود.)
6- سرور : کلید اختصاصی برای تبادیل های اطلاعاتی بعدی کاربر در حین بازی صادر می کند و به اندروید میدهد. این کد تا زمان حضور کاربر در این جلسه از بازی معتبر است.
7- اندروید وارد بازی شده تمامی تبادلات اطلاعاتی بازی برای حساب کاربری را با کلید معتبر اختصاصی خود انجام میدهد.

نه کلید عمومی داخل گوشی ذخیره میشه و نه کلید اختصاصی .

fatima-php
سه شنبه 26 خرداد 1394, 09:24 صبح
مسئله شنود شبکه است که ممکنه کلید اختصاصی لو بره. اگه کلید اختصاصی رو هربار عوض کنیم، هر کلید فقط برای اولین درخواست بعدی که میاد معتبره. توی بازی هم میتونید اگه با کلیدی که اطلاعات رو میفرستین، جواب دریافت نکردین، دوباره نام کاربری و رمز عبور رو با کلید عمومی هارد کد شده، ارسال کنید و کلید اختصاصی جدید بگیرین. بهتره زیاد توی شبکه نام کاربری و رمز عبور مبادله نشه. دقت کنید که با دستکاری برنامه ریزی مودمهای وایرلس یا ADSL و یا حتی به روش ساده تر، با قراردادن یک کامپیوتر واسط بعنوان Gateway بین موبایل و مودم، میشه تمام اطلاعاتی که ازطریق بازی داره مبادله میشه رو استخراج کرد. اینجور جاها اهمیت تصادفی بودن کلید اختصاصی مشخص میشه. کلید عمومی هم اسمش روشه: عمومیه و اینکه درخواست بدیم برامون بیاد درست نیست چون ازطریق شبکه داره مبادله میشه.

us1234
سه شنبه 26 خرداد 1394, 09:25 صبح
اصلا نیاز به کلید و سخت کردن پروسه نیست .
شما هر عملی انجام میدهید یوزر پسورد کاربر را هم بفرست کلیه عملیاتها و زمانبندی ها داخل سرور انجام میشه ( یعنی آپ را کلا مثل مرورگر و جاوا اسکریپت در نظر بگیر و برای زیبایی کار ولی در اصل کل منابع ، اتک ها و... با توجه به اطلاعات داخل دیتابیس کاربر داره انجام میشه )

یعنی مثلا من دارم منابع را ارتقا میدم ، این ارتقا ممکنه 2 روز طول بکشه و کارگرم مشغول این ارتقا است پس اگر به هر طریقی بتونم به سرور ریکویست بفرستم برای ارتقا یک منبع دیگه باید سرور زمانبندی شروع و پایان و کل محدودیت های من را بدانم و اجازه این کار را ندهد.

در عمل یعنی آپ میشه اینترفیس و هسته بازی میشه همان سرور.

fatima-php
سه شنبه 26 خرداد 1394, 09:30 صبح
یکی از چیزایی که بهش فکر نکردیم هنوز اینه که آیا چند تا کاربر میتونن با یه اکانت بازی کنن یا نه

بهتره بیخیال این مورد بشین چون یکی از بزرگترین بازیهای آنلاین دنیا یعنی Clash of Clans هم وقتی نفر دوم به اکانت وصل میشه، نفر اول رو میندازه بیرون.