رفتن به مطلب

***جلوگیری از هک پرداخت درون برنامه ای مایکت***


ارسال‌های توصیه شده

سلام،

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

چنین فرایندی آنقدر راحت است که حتی یک کودک 7 ساله هم میتواند چنین عملیاتی را انجام دهد.

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

به همین دلیل مایکت با ارائه یک api از جعل پرداخت درون برنامه ای جلوگیری می کند و امنیت پرداخت درون برنامه ای با استفاده از این سرویس به 100% می رسد.

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

ابتدا باید یک هاست داشته باشید.(اگر هاست ندارید میتوانید یک هاست اشتراکی لینوکس تهیه کنید)

سپس باید کدهای php زیر را در نوت پد پلاس پلاس بنویسید:

<?php
$Access_Token =""; //توکن دسترسی را از مایکت دریافت و اینجا وارد کنید

$packagename = $_GET["packagename"]; //گرفتن پکیج نیم در لینک
$token=$_GET["token"]; //گرفتن توکن خرید داده شده از طرف مایکت
$productid=$_GET["productid"]; //گرفتن شناسه محصول
$opts = array(
  'http'=>array(
    'method'=>"GET",
    'header'=>"X-Access-Token:$Access_Token."\r\n" // ست کردن توکن دسترسی در هدر
  )
);

$context = stream_context_create($opts);
        //تابع زیر اعداد فارسی را به انگلیسی تبدیل می کند
	    function fa_digits($text){
        $persian_digits = array('۰','۱','۲','۳','۴','۵','۶','۷','۸','۹');
        $english_digits = array('0','1','2','3','4','5','6','7','8','9');
        $text = str_replace($persian_digits, $english_digits, $text);
        return $text;
    }


try{
$token_En=fa_digits($token);
}
catch(Exception $e) {
   $token_En=$token;
}

//ارسال درخواست به سرور مایکت برای چک خرید
$file = file_get_contents("https://developer.myket.ir/api/applications/".$packagename."/purchases/products/".$productid."/tokens/".$token_En, false, $context);
$js=json_decode($file);
if($js->purchaseState==0){
    echo "Allowed"; //خرید واقعی است
} else echo ""; //جعل در خرید

?>

فقط تنها کاری که لازم است در ویرایش کدهای php بالا کنید این است که متغیر $Access_Token را برابر با توکن دسترسی قرار دهید.

Untitled.png

برای گرفتن توکن دسترسی به پنل توسعه دهندگی خود در مایکت مراجعه کنید و از منوی یک برنامه گزینه "درون برنامه"را انتخاب کنید. سپس از بالای صفحه دکمه "توکن صحت سنجی" را بزنید تا با تصویری مشابه تصویر بالا روبه رو شوید. حال توکن صحت سنجی را کپی و در متغیر Access_Token بریزید.

فایل حاوی کدهای php را با پسوند "php." ذخیره کنید و در هاست خود آپلود کنید.

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

کارمون با بخش هاست و سرور تموم شد.

حالا باید یک سری کارهارو هم در خود B4A انجام بدیم.

ببینید برای اینکه ما به این فایل php درخواستی ارسال کنیم باید یک لینک داشته باشیم و داخل لینک هم باید سه پارامتر قرار دهیم که عبارت اند از: پکیج نیم برنامه، شناسه محصول و توکن خرید یونیک

کتابخونه پیشفرض درون پرداخت مایکت متاسفانه توکن خرید رو بعد از خرید بر نمی گردونه که به سرور بفرستیم، پس من یک کتابخونه ادیت شده رو در انتها قرار میدم. اونو دانلود کنید و در پوشه librarys بریزید و از اون استفاده کنید.(با کتابخونه خود مایکت هیچ فرقی نداره فقط امکان برگردوندن توکن خرید بهش اضافه شده)

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

ابتدا کتابخونه های Httputils2 و MyketIAP باید فعال باشند.

یک ساب ایجاد کنید تا فرایند چک صحت خرید را بر عهده داشته باشد. بدین شکل:

Sub check_billing(tok As String,id As String)
	Private checker As HttpJob
	checker.Initialize("checker",Me)
	checker.Download("http://MYDomain.ir/myket_billing.php?token="&tok&"&productid="&id&"&packagename="&Application.PackageName)
	End If
	Wait For (j) JobDone(j As HttpJob)
	If j.JobName="checker" Then
	If j.Success Then
		If j.GetString="Allowed" Then
		ToastMessageShow("برنامه خریده شد",True)
        ProgressDialogHide
		Else
		ToastMessageShow("برای هک برنامه تلاش نکنید",True)	
		ProgressDialogHide
		End If
	End If
	End If
	j.Release
End Sub

در تابع بالا یک لینکی به شکل زیر وجود دارد:

http://MYDomain.ir/myket_billing.php?token="&tok&"&productid="&id&"&packagename="&Application.PackageName

لطفا نام دامین و نام فایل php خود را در لینک بالا قرار دهید.

همانگونه که احتمالا میدانید نتیجه خرید در مایکت به ساب BillingManager_PurchaseCompleted بر میگردد. بنابر EventName که در هنگام initialize کتابخانه تعیین می شود ممکن است BillingManager فرق داشته باشد. پس در این ساب، تابع بالا باید صدا زده شود.

Sub BillingManager_PurchaseCompleted(Success As Boolean, Product As Purchase)
	If Success=True Then
		ProgressDialogShow2("در حال چک صحت خرید...",False)
		check_billing(Product.getToken,Product.ProductId)
		End If
End Sub

بنابراین ما توانستیم با کمی تلاش دست مهاجمان را کوتاه کنیم تا نتوانند زحمات ما را ضایع کنند.:DD::Laie_60B:

و اما نکته آخر: گاهی پس از خرید ممکن است یک فایل TXT ذخیره کنید برای اینکه هربار چک کنید آیا قبلا محصول خریده شده است یا نه!

حدالامکان از روش های استاندارد برای این کار استفاده کنید و حتی اگر از ایجاد فایل TXT استفاده می کنید همه چیز را رمزنگاری کرده و آن را در مکان های ناامن که ممکن است کاربر دسترسی داشته باشد(مثل dirrootexternal) ذخیره نکنید. چون حتی اگر از Api مایکت برای جلوگیری از جعل پرداخت درون برنامه ای استفاده کرده باشید ممکن است مهاجم برنامه شما را دیکامپایل کرده و مسیر ذخیره فایل TXT پس از خرید را تشخیص داده و یک فایل TXT در مسیر تعیین شده ایجاد کند و برنامه به اشتباه وجود آن فایل TXT را دلیلی بر خرید کاربر ببیند و محصول تحویل مهاجم داده شود.

کتابخانه اصلاحی پرداخت درون برنامه ای مایکت: دانلود

هزینه استفاده از این مطلب آموزشی: پنج صلوات

امیدوارم استفاده لازم را برده باشید.

در پناه حق، موفق باشید:53::53::53:

لینک ارسال
به اشتراک گذاری در سایت های دیگر

  • 1 ماه بعد...

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

سوالی که دارم اینه،این فرایند صحت سنجی ،چقدر زمان می بره(یعنی کاربر چقدر باید منتظر بمانه تا خرید انجام بشه)؟یا فرق زمانی در روند پرداخت درون برنامه ای ایجاد نمی کنه؟

و آیا برای صحت سنجی حتما به هاست نیاز داریم؟و اون هاست اگر پس از یه مدت غیرفعال شد تکلیف چیه!

درکل راهی هست که از این بابت هاست خیالمون راحت باشه که از بین نمیره؟

و آیا پرداخت درون برنامه ای کافه بازار به وسیله پلاگین باباردور رو مشاهده کرده اید؟

لینک ارسال
به اشتراک گذاری در سایت های دیگر

در ۱۴۰۰/۵/۱۴ در 23:00، Seyedhamidreza Seyedalikhani گفته است:

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

سوالی که دارم اینه،این فرایند صحت سنجی ،چقدر زمان می بره(یعنی کاربر چقدر باید منتظر بمانه تا خرید انجام بشه)؟یا فرق زمانی در روند پرداخت درون برنامه ای ایجاد نمی کنه؟

و آیا برای صحت سنجی حتما به هاست نیاز داریم؟و اون هاست اگر پس از یه مدت غیرفعال شد تکلیف چیه!

درکل راهی هست که از این بابت هاست خیالمون راحت باشه که از بین نمیره؟

و آیا پرداخت درون برنامه ای کافه بازار به وسیله پلاگین باباردور رو مشاهده کرده اید؟

سلام،

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

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

شما اولا نباید بزارید هاست تون غیرفعال بشه. هزینه هاست اونقدری سنگین نیست که بخاطرش بزارین برنامه تون از کار بیفته. اگه با همین روال و آموزش من پیش برین و هاست تون غیرفعال بشه progressbar همچنان میچرخه و hide نمیشه، اما میتونین خودتون با کمی ویرایش کدها و خلاقیت تعریف کنید که اگه ارتباط با سرور برقرار نشد محصول همینجوری بدون چک اعتبار به کاربر تحویل داده بشه.(قطعا عدم برقراری ارتباط به خاطر آفلاین بودن کاربر نخواهد بود چون کاربر یک وجهی رو پرداخت کرده و آنلاینه مگه اینکه بخواد هک کنه و آفلاین باشه)

پلاگین باباردو هم اشتباه نکنم برای یونیتی هستش و در حوزه تخصصی من نیست.

موفق باشید:53:

لینک ارسال
به اشتراک گذاری در سایت های دیگر

در ۱۴۰۰/۴/۱۰ در ۱۲:۳۲، امیرحسین قاسمی گفته است:

سلام،

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

چنین فرایندی آنقدر راحت است که حتی یک کودک 7 ساله هم میتواند چنین عملیاتی را انجام دهد.

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

به همین دلیل مایکت با ارائه یک api از جعل پرداخت درون برنامه ای جلوگیری می کند و امنیت پرداخت درون برنامه ای با استفاده از این سرویس به 100% می رسد.

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

ابتدا باید یک هاست داشته باشید.(اگر هاست ندارید میتوانید یک هاست اشتراکی لینوکس تهیه کنید)

سپس باید کدهای php زیر را در نوت پد پلاس پلاس بنویسید:

<?php
$Access_Token =""; //توکن دسترسی را از مایکت دریافت و اینجا وارد کنید

$packagename = $_GET["packagename"]; //گرفتن پکیج نیم در لینک
$token=$_GET["token"]; //گرفتن توکن خرید داده شده از طرف مایکت
$productid=$_GET["productid"]; //گرفتن شناسه محصول
$opts = array(
  'http'=>array(
    'method'=>"GET",
    'header'=>"X-Access-Token:$Access_Token."\r\n" // ست کردن توکن دسترسی در هدر
  )
);

$context = stream_context_create($opts);
        //تابع زیر اعداد فارسی را به انگلیسی تبدیل می کند
	    function fa_digits($text){
        $persian_digits = array('۰','۱','۲','۳','۴','۵','۶','۷','۸','۹');
        $english_digits = array('0','1','2','3','4','5','6','7','8','9');
        $text = str_replace($persian_digits, $english_digits, $text);
        return $text;
    }


try{
$token_En=fa_digits($token);
}
catch(Exception $e) {
   $token_En=$token;
}

//ارسال درخواست به سرور مایکت برای چک خرید
$file = file_get_contents("https://developer.myket.ir/api/applications/".$packagename."/purchases/products/".$productid."/tokens/".$token_En, false, $context);
$js=json_decode($file);
if($js->purchaseState==0){
    echo "Allowed"; //خرید واقعی است
} else echo ""; //جعل در خرید

?>

فقط تنها کاری که لازم است در ویرایش کدهای php بالا کنید این است که متغیر $Access_Token را برابر با توکن دسترسی قرار دهید.

Untitled.png

برای گرفتن توکن دسترسی به پنل توسعه دهندگی خود در مایکت مراجعه کنید و از منوی یک برنامه گزینه "درون برنامه"را انتخاب کنید. سپس از بالای صفحه دکمه "توکن صحت سنجی" را بزنید تا با تصویری مشابه تصویر بالا روبه رو شوید. حال توکن صحت سنجی را کپی و در متغیر Access_Token بریزید.

فایل حاوی کدهای php را با پسوند "php." ذخیره کنید و در هاست خود آپلود کنید.

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

کارمون با بخش هاست و سرور تموم شد.

حالا باید یک سری کارهارو هم در خود B4A انجام بدیم.

ببینید برای اینکه ما به این فایل php درخواستی ارسال کنیم باید یک لینک داشته باشیم و داخل لینک هم باید سه پارامتر قرار دهیم که عبارت اند از: پکیج نیم برنامه، شناسه محصول و توکن خرید یونیک

کتابخونه پیشفرض درون پرداخت مایکت متاسفانه توکن خرید رو بعد از خرید بر نمی گردونه که به سرور بفرستیم، پس من یک کتابخونه ادیت شده رو در انتها قرار میدم. اونو دانلود کنید و در پوشه librarys بریزید و از اون استفاده کنید.(با کتابخونه خود مایکت هیچ فرقی نداره فقط امکان برگردوندن توکن خرید بهش اضافه شده)

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

ابتدا کتابخونه های Httputils2 و MyketIAP باید فعال باشند.

یک ساب ایجاد کنید تا فرایند چک صحت خرید را بر عهده داشته باشد. بدین شکل:

Sub check_billing(tok As String,id As String)
	Private checker As HttpJob
	checker.Initialize("checker",Me)
	checker.Download("http://MYDomain.ir/myket_billing.php?token="&tok&"&productid="&id&"&packagename="&Application.PackageName)
	End If
	Wait For (j) JobDone(j As HttpJob)
	If j.JobName="checker" Then
	If j.Success Then
		If j.GetString="Allowed" Then
		ToastMessageShow("برنامه خریده شد",True)
        ProgressDialogHide
		Else
		ToastMessageShow("برای هک برنامه تلاش نکنید",True)	
		ProgressDialogHide
		End If
	End If
	End If
	j.Release
End Sub

در تابع بالا یک لینکی به شکل زیر وجود دارد:

http://MYDomain.ir/myket_billing.php?token="&tok&"&productid="&id&"&packagename="&Application.PackageName

لطفا نام دامین و نام فایل php خود را در لینک بالا قرار دهید.

همانگونه که احتمالا میدانید نتیجه خرید در مایکت به ساب BillingManager_PurchaseCompleted بر میگردد. بنابر EventName که در هنگام initialize کتابخانه تعیین می شود ممکن است BillingManager فرق داشته باشد. پس در این ساب، تابع بالا باید صدا زده شود.

Sub BillingManager_PurchaseCompleted(Success As Boolean, Product As Purchase)
	If Success=True Then
		ProgressDialogShow2("در حال چک صحت خرید...",False)
		check_billing(Product.getToken,Product.ProductId)
		End If
End Sub

بنابراین ما توانستیم با کمی تلاش دست مهاجمان را کوتاه کنیم تا نتوانند زحمات ما را ضایع کنند.:DD::Laie_60B:

و اما نکته آخر: گاهی پس از خرید ممکن است یک فایل TXT ذخیره کنید برای اینکه هربار چک کنید آیا قبلا محصول خریده شده است یا نه!

حدالامکان از روش های استاندارد برای این کار استفاده کنید و حتی اگر از ایجاد فایل TXT استفاده می کنید همه چیز را رمزنگاری کرده و آن را در مکان های ناامن که ممکن است کاربر دسترسی داشته باشد(مثل dirrootexternal) ذخیره نکنید. چون حتی اگر از Api مایکت برای جلوگیری از جعل پرداخت درون برنامه ای استفاده کرده باشید ممکن است مهاجم برنامه شما را دیکامپایل کرده و مسیر ذخیره فایل TXT پس از خرید را تشخیص داده و یک فایل TXT در مسیر تعیین شده ایجاد کند و برنامه به اشتباه وجود آن فایل TXT را دلیلی بر خرید کاربر ببیند و محصول تحویل مهاجم داده شود.

کتابخانه اصلاحی پرداخت درون برنامه ای مایکت: دانلود

هزینه استفاده از این مطلب آموزشی: پنج صلوات

امیدوارم استفاده لازم را برده باشید.

در پناه حق، موفق باشید:53::53::53:

پنج تا صلوات رو فرستادم

ممنون

لینک ارسال
به اشتراک گذاری در سایت های دیگر

بایگانی شده

این موضوع بایگانی و قفل شده و دیگر امکان ارسال پاسخ نیست.

  • کاربران آنلاین در این صفحه   0 کاربر

    • هیچ کاربر عضوی،در حال مشاهده این صفحه نیست.
×
×
  • اضافه کردن...