PDA

View Full Version : سوال: بهترین روش برای ارسای شماره فاکتور به درگاه بانک



r4hgozar
دوشنبه 31 فروردین 1394, 08:59 صبح
سلام.
می خواستم بدونم امن ترین روش برای ارسال شماره منحصر به فرد به درگاه بانک و خوندن اون بعد پرداخت چیه؟
کوئری استرینگ یا session.

ممنون

IR-Developer
دوشنبه 31 فروردین 1394, 09:53 صبح
سلام.
می خواستم بدونم امن ترین روش برای ارسال شماره منحصر به فرد به درگاه بانک و خوندن اون بعد پرداخت چیه؟
کوئری استرینگ یا session.

ممنون

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

niloo17
دوشنبه 31 فروردین 1394, 10:00 صبح
من از Session استفاده می کنم . مقدار را کد می کنم و با session می فرستم.

alireza_s_84
دوشنبه 31 فروردین 1394, 10:27 صبح
سلام.
می خواستم بدونم امن ترین روش برای ارسال شماره منحصر به فرد به درگاه بانک و خوندن اون بعد پرداخت چیه؟
کوئری استرینگ یا session.

ممنون

وقتی میگین ارسال یعنی درگاه بانک به Session سایت شما دسترسی نداره پس چطور میخواین با Session چیزی رو به جای دیگه بفرستین؟؟؟!!! Session فقط در Context جاری شما قابل دسترسی هست و فقط Application در حال اجرا قابلیت دسترسی به اون رو داره.

alireza_s_84
دوشنبه 31 فروردین 1394, 10:28 صبح
من از Session استفاده می کنم . مقدار را کد می کنم و با session می فرستم.

میشه نمونه کدی قرار بدین که من ببینم چطور با Session به درگاه بانک چیزی رو میفرستین؟؟؟!!!

RIG000
دوشنبه 31 فروردین 1394, 12:56 عصر
شما باید یه جدول order و یه orderdetailes داشته باشی .
order شما فاکتور و orderdetiles زیر فاکتور هست
. یه order که هر روکوردش یک فاکتور منحصصر به فرد با یک شماره id هست ، میتونه یک یا چندین زیر فاکتور داشته باشه .
از اونجایی که بانک برای هر بار درخواست شما به درگاه یک شماره منحصر به فرد میخاد شما نمیتونی یک شماره فاکتور رو چندین بار براش بفرستی یعنی ممکن کاربر شما یه بار به درگاه بره پرداخت نکنه یا به هر دلیلی منسرف بشه و ... اگر بخاد منصرف شه و دوباره (یک زمانی دیگه) اون فاکتور رو پرداخت کنه ... نمیتونه شماره فاکتوری رو که قبلا ارسال کرده رو دوباره بفرسته زیرا بانک میگ تکراری هستش...
پس شما باید یه شماره فاکتور تولید کنی. یه جدول دیگه میسازی مثلا به اسم uniqnum که شماره فاکتورت رو توش ذخیره میکنی ... و سپس ازش یه شماره یکتا میگیری. یعنی عملا شما برای هر بار رفتن به بانک یه شماره ای دی میسازی و سپس ارسالش میکنی به بانک و بعد از گرفتن دریافت اطلاعاتت میای فاکتورت رو میبندی و ...

برای انجام اینکار ها یک روالی در پیش داری که مقداری رو ادد میکنی به جدول uniqnum و سپس میخونیش و شماره فاکتر و مبلغ و ... رو میفرستی جواب میگیری و ....
شما به یکسری query ها نیاز داری که بزنی.

niloo17
پنج شنبه 03 اردیبهشت 1394, 08:28 صبح
میشه نمونه کدی قرار بدین که من ببینم چطور با Session به درگاه بانک چیزی رو میفرستین؟؟؟!!!

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



var form = document.createElement("form");
form.setAttribute("method", "POST");
form.setAttribute("action", "@ViewBag.PaymentUrl");
form.setAttribute("target", "_self");
var hiddenField = document.createElement("input");
hiddenField.setAttribute("name", "RefId");
hiddenField.setAttribute("value", "@ViewBag.RefId");

form.appendChild(hiddenField);

document.body.appendChild(form);
form.submit();
document.body.removeChild(form);


بعضی از پارامترهای مورد نیاز هنگام برگشت را با session می فرستم.

r4hgozar
پنج شنبه 03 اردیبهشت 1394, 10:09 صبح
الان میشه دوستان بگن کدوم روش بهتره؟؟

alireza_s_84
پنج شنبه 03 اردیبهشت 1394, 17:54 عصر
ببخشید من منظورشونو از سوال اشتباه متوجه شدم .
من برای ارسال مقدار به بانک ملت از کد زیر استفاده می کنم.



var form = document.createElement("form");
form.setAttribute("method", "POST");
form.setAttribute("action", "@ViewBag.PaymentUrl");
form.setAttribute("target", "_self");
var hiddenField = document.createElement("input");
hiddenField.setAttribute("name", "RefId");
hiddenField.setAttribute("value", "@ViewBag.RefId");

form.appendChild(hiddenField);

document.body.appendChild(form);
form.submit();
document.body.removeChild(form);


بعضی از پارامترهای مورد نیاز هنگام برگشت را با session می فرستم.

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

باز هم تاکید میکنم ارسال پارامترها با Session یک تصور غلط هست که بای از ذهنتون دور کنید.
ارسال پارامتر یا به صورت Get هست یا Post. (البته چند سالی هست متدهای دیگه ای همچون Put و ... اضافه شدن کهکاربرد خاص حودشون رو دارن)



الان میشه دوستان بگن کدوم روش بهتره؟؟
برای ارسال پارامترهای مورد نیاز به درگاه بانک فرقی نمیکنه از کدوم روش استفاده کنید. (Get یا Post). اغلب درگاهها ارسال اطلاعات رو به روش Post مهیا میکنن ولی در عمل فرق چندانی وجود نداره. بهتره از Post برای ارسال پارامترهای موردنیاز استفاده بشه. کلاسی که من برای ارسال داده ها از اون استفاده میکنم به شکل زیر هست:

public int Send(double amount)
{
int result = -1;


try
{
WebRequest webRequest = WebRequest.Create(SendUrl);


webRequest.Method = "POST";
webRequest.ContentType = "application/x-www-form-urlencoded";


string parameters = String.Format("api={0}&amount={1}&redirect={2}", api, amount, redirect);
byte[] bytes = Encoding.UTF8.GetBytes(parameters);


webRequest.ContentLength = bytes.Length;
Stream dataStream = webRequest.GetRequestStream();
dataStream.Write(bytes, 0, bytes.Length);
dataStream.Close();




WebResponse webResponse = webRequest.GetResponse();
dataStream = webResponse.GetResponseStream();
StreamReader reader = new StreamReader(dataStream);
string responseFields = reader.ReadToEnd();
reader.Close();


if (int.TryParse(responseFields, out result) == false)
{
result = -1;
}
}
catch
{
return -1;
}


return result;
}




شما میتونید در خط string parameters = String.Format("api={0}&amount={1}&redirect={2}", api, amount, redirect); هر تعداد پارامتر دوست دارین تعریف کنید و به بانک ارسال کنید.
این کلاس از متد Post برای ارسال اطلاعات استفاده میکنه.

RIG000
پنج شنبه 03 اردیبهشت 1394, 23:47 عصر
ابتدا اینکه من توی کدی که شما قرار دادین هچ نقشی برای Session نمیبینم.
دوم اینکه اصلا این شیوه ارسال مطالب قابل قبول نیست. پرداخت بانک با جاوا اسکریپت؟؟؟!!! یک المنت فرم اضافه کنید و بعد ارسال حذف کنید!!!
به شدت توصیه میکنم وقت بیشتری برای مطالعه پیرامون امنیت در پرداخت های آنلاین و مکانیزم اون بذارید.

باز هم تاکید میکنم ارسال پارامترها با Session یک تصور غلط هست که بای از ذهنتون دور کنید.
ارسال پارامتر یا به صورت Get هست یا Post. (البته چند سالی هست متدهای دیگه ای همچون Put و ... اضافه شدن کهکاربرد خاص حودشون رو دارن)


برای ارسال پارامترهای مورد نیاز به درگاه بانک فرقی نمیکنه از کدوم روش استفاده کنید. (Get یا Post). اغلب درگاهها ارسال اطلاعات رو به روش Post مهیا میکنن ولی در عمل فرق چندانی وجود نداره. بهتره از Post برای ارسال پارامترهای موردنیاز استفاده بشه. کلاسی که من برای ارسال داده ها از اون استفاده میکنم به شکل زیر هست:

public int Send(double amount)
{
int result = -1;


try
{
WebRequest webRequest = WebRequest.Create(SendUrl);


webRequest.Method = "POST";
webRequest.ContentType = "application/x-www-form-urlencoded";


string parameters = String.Format("api={0}&amount={1}&redirect={2}", api, amount, redirect);
byte[] bytes = Encoding.UTF8.GetBytes(parameters);


webRequest.ContentLength = bytes.Length;
Stream dataStream = webRequest.GetRequestStream();
dataStream.Write(bytes, 0, bytes.Length);
dataStream.Close();




WebResponse webResponse = webRequest.GetResponse();
dataStream = webResponse.GetResponseStream();
StreamReader reader = new StreamReader(dataStream);
string responseFields = reader.ReadToEnd();
reader.Close();


if (int.TryParse(responseFields, out result) == false)
{
result = -1;
}
}
catch
{
return -1;
}


return result;
}




شما میتونید در خط string parameters = String.Format("api={0}&amount={1}&redirect={2}", api, amount, redirect); هر تعداد پارامتر دوست دارین تعریف کنید و به بانک ارسال کنید.
این کلاس از متد Post برای ارسال اطلاعات استفاده میکنه.

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

الان ایراد اون اسکریپت چیه؟!
بانک ملت از متد get پشتبانی نمیکنه ... حداقل من نتونستم اینکار رو کنم. اما پارسیان چرا پشتیبانی میکنه ...

sohil_ww
پنج شنبه 03 اردیبهشت 1394, 23:54 عصر
یعنی کد جاوا رو بانک ملت قرار داده ؟ کدی که سمت کلاینت هست و به راحتی قابله تغیره ؟
من زیاد در این زمینه متخصص نیستم ولی فکر نکنم استفاده از کد های سمت کلاینت راه درستی باشه
و باتشکر از دوستمون علیرضا جان بابته کد (که تشکر هم کردیم ) و معرفی متد put که من برای آشنا نیست و برای آشنایی با این متد نیاز مند مطالعه هستم(که اینو نمیشد تشکر کرد اخه یه بار بیشتر نمیشه )
و در صورت پیدا کردن لینک های مفید برای دوستان در این صفحه هم قرار خواهم داد

alireza_s_84
جمعه 04 اردیبهشت 1394, 10:11 صبح
اون اسکریپتی که گذاشتن دوستمون اسکریپت خود بانک ملت هستش که داده . الان من مشکل اینکه بحث امینیت رو گفتید نتونستم متوجه بشم که دقیقا چه مشکلی داره این بحث امنیت تو این اسکریپت.

الان ایراد اون اسکریپت چیه؟!
بانک ملت از متد get پشتبانی نمیکنه ... حداقل من نتونستم اینکار رو کنم. اما پارسیان چرا پشتیبانی میکنه ...
اگر بانک این کد رو قرار داده باشه که باید بگم وتقعا براشون متاسفم.
اول اینکه اون خط آخر کد که مربوط به حذف فرم هست اصلا اجرا نمیشه چون وقتی فرم سابمیت شد دیگه نوبت اون خط آخر نمیشه چون منتقل میشم به درگاه بانک.
دوم اینکه به راحتی میشه یک درگاه مشابه بانک ساخت و به این روش کاربر رو به درگاه جعلی منتقل کرد.
اگر جاوا اسکریپت در مرورگر غیرفعال باشه این کد کار نمیکنه.
وقتی میشه در سمت سرور با سرعت و امنیت بیشتر کاربر رو به سمت درگاه هدایت کرد لزومی نداره اینکار به کلاینت و مرورگر سپرده بشه. فقط لازمه لینک مورد نظر در سمت سرور ساخته بشه و بعد با کد 301 به درگاه Redirect بشه. مزیت این روش در اینه که یک مرحله از پردازش مرورگر حذف میشه و کاربر مستقیما به درگاه منتقل میشه.
نکته آخر اینکه از لحاظ امنیتی بکارگیری کد جاوا اسکریپت مشکلی پیش نمیاره ولی بهتره اسفاده نشه.

RIG000
جمعه 04 اردیبهشت 1394, 11:59 صبح
در این قسمت =>
دوم اینکه به راحتی میشه یک درگاه مشابه بانک ساخت و به این روش کاربر رو به درگاه جعلی منتقل کرد. => فکر کنم به اسکریپت ربط نداشته باشه چون در هر صورت شما با کدی که گذاشتید هم میتونی یه درگاه ایجاد کنی و با کدت اطلاعات رو به درگاه جعلی رد کنی و .... درسته ؟
اگر جاوا اسکریپت در مرورگر غیرفعال باشه این کد کار نمیکنه. این رو موافقم .
وقتی میشه در سمت سرور با سرعت و امنیت بیشتر کاربر رو به سمت درگاه هدایت کرد لزومی نداره اینکار به کلاینت و مرورگر سپرده بشه. فقط لازمه لینک مورد نظر در سمت سرور ساخته بشه و بعد با کد 301 به درگاه Redirect بشه. مزیت این روش در اینه که یک مرحله از پردازش مرورگر حذف میشه و کاربر مستقیما به درگاه منتقل میشه. این رو هم موافقم. اما نمیشه گفت ما انقدر هم بار پردازشی خاصی رو سمت مرور گر داشته باشیم ..

نکته آخر اینکه از لحاظ امنیتی بکارگیری کد جاوا اسکریپت مشکلی پیش نمیاره ولی بهتره اسفاده نشه. منظورم همین امنیت بود . به هر حال در هر صورت تغییری که رو مقدار مبلغ داده بشه یا ... و هر چیزی که دارنده سایت مبلغش تغییر داده بشه توسط کاربر و کمتر بشه بعدا با متد veryfy و ... میشه چک کرد مبلغ پرداختی رو با مبلغی که مبلغ کل هست و اگر اوکی بود ... که میتونی اون موقع پول خریدار رو بخوری و واسش Veryfy بزنی ولی جنس رو بهش ندی .... یا اینکه کلا مبلغ رو براش veryfy نکنی هرچند که پرداخت کرده و دوباره اون مبلغی که دستکاری کرده بود رو بره از اول خرید کنه و دیگه از اینکارا نکنه (چون ممکن هست پولش رو بخوریم جنسشم ندیم..)
و خیلی چیز های دیگه .
من در کل با send اطلاعات زیاد مشکلی ندارم اما موقع باز گشت از بانک اون موقع میبینم چی شده ....
---------------------------
در مورد این اسکریپت هم باید بگم شرکت به پرداخت به عنوان شرکت خصوصی اومده زیر نظر بانک ملت کار میکنه .... که الانش هم یه قرارداد برام فرستادن تا توسایت xxx مثلا لوگوشونو بذارم و ... که یه نامه پستی هست . نمیدونم فقط اجباریه یا اختیاری ... !!! به پرداخت درکل جواب مشتریان رو خوب میده ...
به هر حال من از یک لحاظ لاگ های بانک ملت رو هم میگیرم ذخیره میکنم....
بانک ملت کلی متد داره که باید 3یا 4 متدش حتما پیاده سازی بشه....تا پول کلا تصفیه شه . دقیقا یاد م نیست قبلا چیکار کردم اما باید در هر صورت متد های مورد نیاز بانک ها فراخوانی بشه ....

alireza_s_84
جمعه 04 اردیبهشت 1394, 21:13 عصر
دوم اینکه به راحتی میشه یک درگاه مشابه بانک ساخت و به این روش کاربر رو به درگاه جعلی منتقل کرد. => فکر کنم به اسکریپت ربط نداشته باشه چون در هر صورت شما با کدی که گذاشتید هم میتونی یه درگاه ایجاد کنی و با کدت اطلاعات رو به درگاه جعلی رد کنی و .... درسته ؟

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

niloo17
شنبه 05 اردیبهشت 1394, 10:10 صبح
من از درگاه بانک ملت استفاده می کنم . که از کدهایی که خودشون داده اند استفاده می کنم. همه پارامترهای مورد نظر کد می شه و فرستاده می شه .
یک سری اطلاعات هستند که در هنگام برگشت از بانک جدا از پارامترهای فرستاده شده لازم هست که اونا را با Session می فرستم .
اگر شما روش های بهتری سراغ دارید ممنون می شم راهنمایی کنید تا همه دوستان استفاده کنیم .