Sina-Soltani / Parbad

A free, open-source, integrated and extensible library which connects your web applications to online payment gateways. Gateways can be added or developed by you.
GNU Lesser General Public License v3.0
364 stars 81 forks source link

سوال در مورد موارد امنیتی #319

Closed RaminMT closed 2 years ago

RaminMT commented 2 years ago

سلام و وقت بخیر امیدوارم که خوب باشید و از شما بابت این کتابخونه عالی تشکر میکنم. یک سوال داشتم، آیا پرباد در برابر باگهای امنیتی که به نوعی هک به حساب میاد ایمن هست یا خیر؟ مثلا double spending یا مغایرت مبلغ پرداختی با مبلغ فاکتور اگر این امکانات تعبیه نشدند، آیا برنامه ای برای اضافه کردن آنها وجود دارد؟ و نهایتا ما جدا از کتابخونه چطور میتونیم اینها رو بررسی کنیم؟ ما در ساختار و پیاده سازی قدیمی درگاه در اپلیکیشن، بواسطه وجود TransactionCode در ابتدای امر، میتونستیم double spending رو قبل از Verify انجام بدیم، اما در حال حاضر در خروجی FetchAsync این مقدار وجود ندارد و تا قبل از Verify کردن امکان دسترسی و بررسی ندارد و اگر Verify کنیم امکان عودت از بین میرود ممنون

Sina-Soltani commented 2 years ago

درود

یک سوال داشتم، آیا پرباد در برابر باگهای امنیتی که به نوعی هک به حساب میاد ایمن هست یا خیر؟ مثلا double spending یا مغایرت مبلغ پرداختی با مبلغ فاکتور

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

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

ا در ساختار و پیاده سازی قدیمی درگاه در اپلیکیشن، بواسطه وجود TransactionCode در ابتدای امر، میتونستیم double spending رو قبل از Verify انجام بدیم، اما در حال حاضر در خروجی FetchAsync این مقدار وجود ندارد و تا قبل از Verify کردن امکان دسترسی و بررسی ندارد و اگر Verify کنیم امکان عودت از بین میرود

شما این پکیج رو ظاهرا به اندازه کافی بررسی نکردید چون داخل همون متد‌های فچ و وریفای، دقیقا این موارد برای شما آورده شده که بتونید تشخیص بدید وضعیت تراکنش فعلی چی هست. متد فچ به شما یک status میده که به شما نشون میده که تراکنش فعلی:

متد وریفای هم به شما یک status میده که نشون میده که تراکنش فعلی:

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

لطفا همچنین داکیومنت رو مطالعه کنید چون تمام این سوالها اونجا توضیح داده شده بود برای شما دریافت وضعیت تراکنش

RaminMT commented 2 years ago

سلام و روز بخیر مجدد ممنون از پاسخ و راهنمایی شما

حقیقتش من هم خودم فکر میکردم که این موارد بررسی شده باشه و خودم هم یه بررسی ای روی سورس انجام دادم و چیزی ندیدم (خیلی دقیق و با وقت و حوصله زیاد بررسی نکردم حقیقتا) و به همین علت بود که از شما سوال کردم لینکی که گذاشتید رو مطمئنم که بیش از 5 بار خوندم، این IsAlreadyVerified در مواقعی که قصد استفاده مجدد از تراکنش رو داریم مقدارش true میشه؟ نهایتا منظورم از شماره پیگیری چیزی هست که توی کد پرباد به عنوان TransactionCode یا توی درگاه های پارسیان و سامان به اسم RRN شناخته میشه بود. و البته قبل از پرسش سوال، تمام داکیومنتها رو خونده بودم، بخش زیادی از FAQ و همچنین issueهای باز و بسته رو هم بررسی کرده بودم باز هم ممنون از شما

Sina-Soltani commented 2 years ago

مقدار PaymentFetchResultStatus.AlreadyProcessed به شما کمک میکنه که بدونید این تراکنشی که از درگاه بانکی به سمت شما اومده، آیا قبلا اصلا بررسی شده یا خیر. حالا اینکه اون تراکنش موفق بوده یا نبوده یا وریفای شده یا نشده اهمیتی نداره.

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

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

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

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

RaminMT commented 2 years ago

خیلی ممنون و متشکرم از توضیحات کامل و جامع شما