PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : رمز کردن اطلاعات api برای عدم استفاده از api ؟



hadiarya
December 12th, 2018, 13:17
اساتید ما یک api داریم میخوایم این وسط کسی از این اطلاعات استفاده نکنه.. مثلا رمزنگاری کنیم اطلاعات رو فقط مطمن شیم اسکریپت ما سمت کلاینت قابلیت خوندن رو داره.. سما کلاینت هم همون وب هست که با js اطلاعات رو میگیریم

hadiarya
December 12th, 2018, 19:04
کسی نیست

lizard.tiny
December 12th, 2018, 21:01
سلام

کافیه یک کلید ایجاد کنید و به اسکریپت هم اون کلید رو بدید

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

در صورتی که کلید وجود نداشته باشه api اجرا نشه و خطا بده

hadiarya
December 12th, 2018, 21:15
سلام

کافیه یک کلید ایجاد کنید و به اسکریپت هم اون کلید رو بدید

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

در صورتی که کلید وجود نداشته باشه api اجرا نشه و خطا بده

مرسی اما مشکل اینه که کلید رو میشه از سورس درآورد..

lizard.tiny
December 12th, 2018, 21:49
دسترسی به api رو به ip یا دامنه محدود کنید

T.Toosi
December 12th, 2018, 21:55
باسلام، در هر صورت اگر فرد کنجکاو باشد کاری از دست شما بر نخواهد آمد، پروتکلی هم برای اینکه تضمین کند کلاینت در صفحه مورد نظر توسط مرورگر خود از وب سرویس استفاد می کند وجود ندارد، اما راه هایی وجود دارد که زندگی را برای این فرد سختر کنید.

به طور مثال در هربار درخواست کاربر می توانید جواب را توسط یک کلید xor کنید سپس این کلید را به آخر جواب خود اضافه کنید سپس این دیتا را در قالب دیتا باینری به کاربر ارسال کنید، سمت کاربر با توجه به طول کلید، کلید را استخراج کرده و دیتا را دوباره xor کنید تا به دیتا اصلی برسید، همچنین اگر قرار است به طور مثال در صفحه mypage وب سرویس شروع به کار کند، در این صفحه یک سشن برای کاربر ایجاد کنید و در درخواست های بعدی از وجود سشن اطمینان حاصل کنید تا در حدی مطمئن شوید کاربر در صفحه مورد نظر از وب سرویس استفاده می کند.

hadiarya
December 12th, 2018, 22:03
دسترسی به api رو به ip یا دامنه محدود کنید

فکر کنم متوجه نشدید.. کاربر من با مرورگرش به api وصل میشه..

- - - Updated - - -


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

به طور مثال در هربار درخواست کاربر می توانید جواب را توسط یک کلید xor کنید سپس این کلید را به آخر جواب خود اضافه کنید سپس این دیتا را در قالب دیتا باینری به کاربر ارسال کنید، سمت کاربر با توجه به طول کلید، کلید را استخراج کرده و دیتا را دوباره xor کنید تا به دیتا اصلی برسید، همچنین اگر قرار است به طور مثال در صفحه mypage وب سرویس شروع به کار کند، در این صفحه یک سشن برای کاربر ایجاد کنید و در درخواست های بعدی از وجود سشن اطمینان حاصل کنید تا در حدی مطمئن شوید کاربر در صفحه مورد نظر از وب سرویس استفاده می کند.

مرسی.. چطوری باینری بفرستم ؟ اگر encrypt کردم چطوری کلید رو قاطیش کنم ؟!

hoka
December 13th, 2018, 02:30
عزیز شما میخوای کسی نتونه از اون api استفاده بکنه و بزاره مثلا داخل سایت خودش و کاربر هاش استفاده کنن ؟

اگر فقط یکبار در هر مراجعه api اطلاعات میده این کد به دردتون میخوره . اگر نه کد دوم که مخصوص api هست رو تغییر بدید که سشن رو پاک نکنه





کد اول هنگام لود صفحه ی مورد نظر ( تنها در همین صفحه اجرا شود و نه کل اسکریپت ( عدم همپوشانی با api به خاطر حذف نشدن سشن))



if (session_status() == PHP_SESSION_NONE) {
session_start();
}

$api_sec = rand(500000, 5000000);
$_SESSION['api_sec'] = $api_sec;

setcookie("api_sec", $api_sec);



کد دوم برای فرانت . متغییر url رو به نام چیزی که هست برای api تغییر بدید


function getCookie(cname) {
var name = cname + "=";
var decodedCookie = decodeURIComponent(document.cookie);
var ca = decodedCookie.split(';');
for(var i = 0; i <ca.length; i++) {
var c = ca[i];
while (c.charAt(0) == ' ') {
c = c.substring(1);
}
if (c.indexOf(name) == 0) {
return c.substring(name.length, c.length);
}
}
return "";
}


var url = 'api.php?api_sec='+getCookie('api_sec');


کد سوم مربوط به api



if(!isset($_SESSION['api_sec']) || empty($_SESSION['api_sec']) || !isset($_GET['api_sec']) || $_GET['api_sec'] != $_SESSION['api_sec']){
die;
} else{
$_SESSION['api_sec'] = "";
}

hadiarya
December 13th, 2018, 02:59
عزیز شما میخوای کسی نتونه از اون api استفاده بکنه و بزاره مثلا داخل سایت خودش و کاربر هاش استفاده کنن ؟

اگر فقط یکبار در هر مراجعه api اطلاعات میده این کد به دردتون میخوره . اگر نه کد دوم که مخصوص api هست رو تغییر بدید که سشن رو پاک نکنه





کد اول هنگام لود صفحه ی مورد نظر ( تنها در همین صفحه اجرا شود و نه کل اسکریپت ( عدم همپوشانی با api به خاطر حذف نشدن سشن))



if (session_status() == PHP_SESSION_NONE) {
session_start();
}

$api_sec = rand(500000, 5000000);
$_SESSION['api_sec'] = $api_sec;

setcookie("api_sec", $api_sec);



کد دوم برای فرانت . متغییر url رو به نام چیزی که هست برای api تغییر بدید


function getCookie(cname) {
var name = cname + "=";
var decodedCookie = decodeURIComponent(document.cookie);
var ca = decodedCookie.split(';');
for(var i = 0; i <ca.length; i++) {
var c = ca[i];
while (c.charAt(0) == ' ') {
c = c.substring(1);
}
if (c.indexOf(name) == 0) {
return c.substring(name.length, c.length);
}
}
return "";
}


var url = 'api.php?api_sec='+getCookie('api_sec');


کد سوم مربوط به api



if(!isset($_SESSION['api_sec']) || empty($_SESSION['api_sec']) || !isset($_GET['api_sec']) || $_GET['api_sec'] != $_SESSION['api_sec']){
die;
} else{
$_SESSION['api_sec'] = "";
}


مرسی.. این روش رو زده بودیم.. راحت میتونه با curl یک درخواست بزنه سشن یا کوکی رو بگیره و ادامه کار..
خودم فهمیدم 100% نمیشه امنش کرد.. اما دنبال راهی هستم به همین راحتی هم از api استفاده نکنه..

hoka
December 13th, 2018, 03:57
مرسی.. این روش رو زده بودیم.. راحت میتونه با curl یک درخواست بزنه سشن یا کوکی رو بگیره و ادامه کار..
خودم فهمیدم 100% نمیشه امنش کرد.. اما دنبال راهی هستم به همین راحتی هم از api استفاده نکنه..

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

T.Toosi
December 13th, 2018, 10:43
مرسی.. چطوری باینری بفرستم ؟ اگر encrypt کردم چطوری کلید رو قاطیش کنم ؟!

باسلام، باید به عملگر های بیتی مسلط باشید، اگر فرض کنیم پاسخ وب سرویس شما در یک رشته باینری PHP ذخیره شده باشد، یک کلید حداقل 16 بایتی برای هر دفعه بسازید و از تابع های mcrypt و openssl استفاده و پاسخ وب سرویس را انکریپت کنید. خروجی کد شده را در یک متغیر ذخیره کنید اما توجه داشته باشید که این خروجی رشته نیست. سپس اگر کلید شما 16 بایت باشد، ما این متغیر را 128 بیت شیف چپ میدیم و در آخر برای ترکیب کلید، 128 بیت کلید را or می کنید با متغیری که خروجی انکریپت شده ی پاسخ وب سرویس در آن ذخیره شده است تا کلید و پاسخ وب سرویس با هم ترکیب شوند که شما اگر این این نتیجه آخر را هم بخواهید به Plaintext تبدیل کنید خواهید دید که قابل خواندن نیست.

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

hadiarya
December 13th, 2018, 17:48
باسلام، باید به عملگر های بیتی مسلط باشید، اگر فرض کنیم پاسخ وب سرویس شما در یک رشته باینری PHP ذخیره شده باشد، یک کلید حداقل 16 بایتی برای هر دفعه بسازید و از تابع های mcrypt و openssl استفاده و پاسخ وب سرویس را انکریپت کنید. خروجی کد شده را در یک متغیر ذخیره کنید اما توجه داشته باشید که این خروجی رشته نیست. سپس اگر کلید شما 16 بایت باشد، ما این متغیر را 128 بیت شیف چپ میدیم و در آخر برای ترکیب کلید، 128 بیت کلید را or می کنید با متغیری که خروجی انکریپت شده ی پاسخ وب سرویس در آن ذخیره شده است تا کلید و پاسخ وب سرویس با هم ترکیب شوند که شما اگر این این نتیجه آخر را هم بخواهید به Plaintext تبدیل کنید خواهید دید که قابل خواندن نیست.

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

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