مشکل تراکنش‌های ناموفق و لاگ اوت شدن کاربران

در 17 دی 1399.

maxresdefault

 

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

در اسفند سال ۹۸ در برخی سایت‌های مشتریان این مشکل را مشاهده نمودیم و روزهای متعددی بر روی عیب یابی آن از سمت اسکریپت پرداختی و سایت و سرور خودمان تمرکز کردیم  که به نتیجه دقیقی نرسیدیم ولی نتیجه و گزارش آن را در مقاله (عدم انجام پرداخت موفق) منتشر کردیم.

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

در تاریخ ۲ شهریور ۹۹ با بررسی لاگ بروزرسانی مرورگر‌ها متوجه شدیم مرورگر کروم و پشت بند آن مرورگر فایرفاکس (موزیلا) تغییراتی در زمینه با بحث کوکی‌ها داشته اند که باعث این مشکلات شده است.

مشکل چه بود؟

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

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

علت مشکل چه بود؟

مرورگر کروم در وبلاگ خود اعلام کرد در نسخه ۸۰ به بعد اقدام به اجرای یک سیستم طبقه بندی کوکی‌های امن و پیش فرض خواهد کرد. برای کوکی‌هایی که مقدار دهی SameSite را انجام نداده باشند بصورت پیش فرض مقدار دهی SameSite=Lax را در نظر خواهد گرفت. و تنها کوکی هایی که بر اساس SameSite=None; Secure تنظیم شده باشند در زمینه با محتوای خارجی در اتصال امن در دسترس خواهند بود. در نتیجه کوکی‌هایی که این شرایط را نداشته باشند مسدود شده و حذف می شوند.

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

راه حل چیست ؟

راه حل این مشکل، ست کردن کوکی ها بر اساس SameSite=None; Secure  می باشد که هر سی ام اس و فریم ورکی شرایط و کدهای مربوط به خود را در این زمینه دارد.

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

اما برای موارد اضطراری ما به شما چند راه حل پیشنهاد خواهیم کرد که احتمالا بر روی سایت هایی با زبان php مثل جوملا، وردپرس و ... این مشکل را برطرف کند.

چگونه سایت خود را تست کنیم ؟

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

برای تست سایتتان آموزش تصویری در نظر گرفته شده است که به کمک ویدئو زیر می توانید وضعیت کوکی‌های سایت خود بررسی کنید.

البته قبل از اعمال این راه حل‌ها لطفا به این مورد دقت کنید :

۱- کوکی ها قدرت کش بالایی دارند و پس از اعمال این کد یا تغییر در کد های سایتتان برای تست موضوع باید کش مرورگر و اسکریپتتان که جوملا یا وردپرس و هر چیزی که هست را چندین بار خالی کنید و برای تست از هر مرور گری باید کش آن مرورگر را خالی کنید .حتی احتمال می دهیم با خالی کردن کش مرورگر باز هم برای چند وقت کش داشته باشید. یکی از دلایل دیر به نتیجه رسید ما همین کش های سنگین کوکی‌ها بود که مدام پاسخ های متفاوت دریافت می کردیم.

۲- اگر هر کدام از راه حل ها بر روی سایت شما اعمال نشد و تصمیم به استفاده از راه حل بعدی گرفتید حتما تغییراتی که قبلا داده اید را به حالت اول برگردانید سپس به سراغ راه حل بعدی بروید.

مرحله اجباری برای تمام سایت ها:

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

جزئیات بیشتری در باره آموزش فعالسازی و اجباری نمودن https نمی توانیم در این مقاله ارائه کنیم ولی با جستجو و مشورت با مدیر هاستتان می توانید به نتیجه برسید.

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

راه حل ویژه سایت‌های وردپرس:

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

سپس در فایل wp-config.php کد زیر را اضافه نموده و ذخیره کنید:

define( ‘WP_SAMESITE_COOKIE’, ‘None’ ); // Pick from ‘Lax’, ‘Strict’, or ‘None’.

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

راه حل اول:

یک خط کد به فایل .htaccess (نقطه در ابتدای نام فایل قرار دارد) سایتتان اضافه نمایید.

کدی که باید به فایل .htaccess اضافه نمایید:

<ifmodule mod_headers.c>
Header always edit Set-Cookie ^(.*)$ $1;SameSite=None;Secure
</ifmodule>

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

راه حل دوم:

یک خط کد به فایل .htaccess (نقطه در ابتدای نام فایل قرار دارد) سایتتان اضافه نمایید.

کدی که باید به فایل .htaccess اضافه نمایید: (این راه حل شبیه به راه حل اول است اما کدهایشان متفاوت است این کد برای سرور آپاچی نسخه پایین تر از 2.2.4 طراحی شده)

<ifmodule mod_headers.c>
Header set Set-Cookie HttpOnly;Secure;SameSite=none
</ifmodule>

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

راه حل سوم:

راه حل دوم برای سایت‌های است که بر اساس زبان برنامه نویسی PHP طراحی شده اند مانند سایت‌های وردپرسی و جوملایی است.

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

همانطور که عرض شد بهترین کار این است که این کار بر اساس قواعد برنامه نویسی توسط برنامه نویس سایت و برنامه شما انجام شود و این روش ها موقتی هستند.

اما مشکلی که قرار دادن این کد در index.php اصلی موجود در روت هاست دارد این است که با بروزرسانی هسته جوملا و وردپرس این خط کد حذف می شود. به همین دلیل تا رفع مشکل اساسی توسط برنامه نویستان باید حواستان به بروزرسانی فایل‌ها باشد و در صورت حذف کد مجددا آن را وارد کنید.

لازم است کد زیر به فایل index.php اصلی سایت شما که معمولا در پوشه اصلی و روت سایت قرار دارد دقیقا یک خط پایین تر از تگ شروع PHP که معمولا در خط اول قرار دارد و به شکل <?php است اضافه شود.

session_set_cookie_params(
    null,
    '/; SameSite=None',
    null,
    1
);

شما هم حتما تجربیات و نظرات خود را با ما در میان بگذارید.

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

 بروزرسانی شده در ۱۷ دی ۱۳۹۹

ارسال نظر


کد امنیتی بارگزاری مجدد

نظرات  

 
0 # حسن دادخواه در تاریخ : ۰۹ آذر ۱۳۹۹ ، ساعت : ۱۱:۰۴ ق.ظ
در روش دوم اصلا لاگین نمیشه
پاسخ دادن | پاسخ همراه با نقل قول | نقل قول | گزارش به مدیر
 
 
0 # حمیدرضا ذوالفقار در تاریخ : ۲۵ دی ۱۳۹۹ ، ساعت : ۰۸:۵۳ ق.ظ
با سلام و احترام
دسترسی سایتتان را بخش پشتیبانی دپارتمان طراحی ارسال بفرمایید بررسی کنم.
پاسخ دادن | پاسخ همراه با نقل قول | نقل قول | گزارش به مدیر
 
 
+1 # محمدعلی حجار در تاریخ : ۲۴ مهر ۱۳۹۹ ، ساعت : ۰۸:۰۸ ق.ظ
با سلام
ضمن تشکر از بررسی های فنی و اقدامات خوبی که انجام دادین. به اطلاع میرساند مشکل من با راه حل دوم رفع گردید.
با سپاس
پاسخ دادن | پاسخ همراه با نقل قول | نقل قول | گزارش به مدیر
 
 
+7 # امین دشتی در تاریخ : ۰۴ مهر ۱۳۹۹ ، ساعت : ۰۸:۳۰ ب.ظ
سلام
ممنون بابت اشتراک گزاری مطلب
راستش چند ماهی بود درگیر بودم و آخر سر داشتم به این نتیجه میرسیدم که ایراد از هسته وردپرس باید باشه!
جهت تکمیل مطلب فوق منم تجربیات خودمو بهش اضافه میکنم
راهکار اولی که ارائه کردید صرفا در وب سرورهای آپاچی قابل انجام هست و روی یکی از سایتهای من نتیجه مثبت داد، اما وب سرورهای لایت اسپید این کدرو نمیتونن اجرا کنن
برای وب سرورهای لایت اسپید اگر نسخه 5.4.9 build 2 به بعد باشن باید ForceSecureCook ie secure same_site_none داخل تگ در فایل htaccess استفاده بشه در غیر اینصورت باید داخل php.ini از کد session.cookie_ samesite = None استفاده بشه که اونم در اکثریت سرورها مسدود شده!
درکل میشه گفت نمیشه در سرور لایت اسپید بدون همکاری هاستینگ کاری انجام داد!
در مورد راهکار دومی که ارائه کردید من روی وردپرس به طرق مختلف (از جمله action init و فایل index.php) تست کردم اما نتیجه نداد متاسفانه
پاسخ دادن | پاسخ همراه با نقل قول | نقل قول | گزارش به مدیر
 
 
0 # afzal zadeh در تاریخ : ۰۱ مهر ۱۳۹۹ ، ساعت : ۱۲:۰۴ ب.ظ
با سلام
راهکار اول که جواب نداد و دومی هم در فایل index.php قابل جای گذاری نیست همینطور که میدونید فایل های whmcs کد شده هست.
اگه راهکاری دارید ممنون میشیم بفرمایید
پاسخ دادن | پاسخ همراه با نقل قول | نقل قول | گزارش به مدیر
 
 
+1 # حمیدرضا ذوالفقار در تاریخ : ۰۱ مهر ۱۳۹۹ ، ساعت : ۱۲:۰۵ ب.ظ
نقل قول از afzal zadeh:
با سلام
راهکار اول که جواب نداد و دومی هم در فایل index.php قابل جای گذاری نیست همینطور که میدونید فایل های whmcs کد شده هست.
اگه راهکاری دارید ممنون میشیم بفرمایید

راهکار اول جواب نداد دقیقا یعنی چی و توضیح بدید.
نسخه php هاستتان چند است ؟
پاسخ دادن | پاسخ همراه با نقل قول | نقل قول | گزارش به مدیر
 
 
0 # afzal zadeh در تاریخ : ۰۱ مهر ۱۳۹۹ ، ساعت : ۰۱:۲۷ ب.ظ
درود بر شما
راهکار اول جواب نداد دقیقا یعنی چی و توضیح بدید.؟
منظور اینکه تکه کد رو در فایل htaccess. قرار داده هیچ تغییری ایجاد نشد.همانند اول پول کسر میشه و بعد از 10 , 15 دقیقه برگشت میخوره بانک مبدا
نسخه php هاستتان چند است ؟ 7.2
پاسخ دادن | پاسخ همراه با نقل قول | نقل قول | گزارش به مدیر
 
 
0 # حمیدرضا ذوالفقار در تاریخ : ۰۲ مهر ۱۳۹۹ ، ساعت : ۰۶:۵۸ ق.ظ
لطفا پشتیبانی فنی درخواست بدهید تا بتوانیم سایتتان را بررسی کنیم.
پاسخ دادن | پاسخ همراه با نقل قول | نقل قول | گزارش به مدیر
 
 
0 # کریم ضیایی در تاریخ : ۱۷ شهریور ۱۳۹۹ ، ساعت : ۰۲:۲۷ ب.ظ
سلام. راه حل اول را در جوملا اعمال کردم . بعد از خالی کردن کش برای خودم جواب گرفتم.
کاربران دیگر اما نتونستن پرداخت کنند
با راه حل دوم ورود به محیط کاربری امکان نداره . وقتی کد را از فایل php حذف می کنم مجدد امکان ورود بر می گرده
پاسخ دادن | پاسخ همراه با نقل قول | نقل قول | گزارش به مدیر
 
 
0 # حمیدرضا ذوالفقار در تاریخ : ۱۷ شهریور ۱۳۹۹ ، ساعت : ۰۳:۰۵ ب.ظ
سلام نسخه php سرور چند است ؟
پاسخ دادن | پاسخ همراه با نقل قول | نقل قول | گزارش به مدیر
 
 
0 # کریم ضیایی در تاریخ : ۱۷ شهریور ۱۳۹۹ ، ساعت : ۰۵:۱۲ ب.ظ
نسخهphp 7.3
پاسخ دادن | پاسخ همراه با نقل قول | نقل قول | گزارش به مدیر
 
 
0 # حمیدرضا ذوالفقار در تاریخ : ۰۲ مهر ۱۳۹۹ ، ساعت : ۰۶:۵۹ ق.ظ
سلام
آیا گواهی ssl در سایتتان فعال است ؟
پاسخ دادن | پاسخ همراه با نقل قول | نقل قول | گزارش به مدیر
 
 
0 # مهربد در تاریخ : ۲۵ دی ۱۳۹۹ ، ساعت : ۰۸:۱۹ ق.ظ
درود وقت بخیر
ممنون از مقاله ی خوبی که قرار دادین. ماهم دقیقا همین مورد داریم با روش دوم کوکی ها به شکل صحیح ست میشن ولی امکان ورود به مدیریت سایت نداریم.
نسخه php 7.3
ssl فعال
و پرستاشاپ هستیم
پاسخ دادن | پاسخ همراه با نقل قول | نقل قول | گزارش به مدیر
 
 
0 # حمیدرضا ذوالفقار در تاریخ : ۲۵ دی ۱۳۹۹ ، ساعت : ۰۸:۵۶ ق.ظ
سلام
بخش پشتیبانی دپارتمان طراحی سایت دسترسی سایتتان و هاستتان را ارسال کنید بررسی خواهم کرد.
پاسخ دادن | پاسخ همراه با نقل قول | نقل قول | گزارش به مدیر
 
 
+1 # sharifsoft در تاریخ : ۱۳ شهریور ۱۳۹۹ ، ساعت : ۰۸:۵۹ ق.ظ
سلام
واقعا ممنونم از اطلاعاتي كه منتشر كرديد
حدود دو هفته به در و ديوار ميزدم كه مشكل رو حل كنم ولي هيچي به هيچي
پذيرنده ها هم همگي بجز به پرداخت ملت از اساس منكر قضيه بودند
من روش httpaccess رو انجام دادم و فعلا مشكل حل شده
خيلي خيلي ممنون
پاسخ دادن | پاسخ همراه با نقل قول | نقل قول | گزارش به مدیر
 
 
+2 # Payam در تاریخ : ۰۵ شهریور ۱۳۹۹ ، ساعت : ۰۵:۲۵ ق.ظ
باسلام و خسته نباشید
کدهای اعلامی را من در .htaccess قراردادم و تمام درگاه ها را چک کردم و تا این لحظه میتونم بگویم مشکل برطرف شده است من تمامی درگاه ها را دارم که از کار افتاده بودند ولی الان دارند تراکنش را موفق انجام میدهند
با تشکر و احترام
پاسخ دادن | پاسخ همراه با نقل قول | نقل قول | گزارش به مدیر
 
 
+1 # حمیدرضا ذوالفقار در تاریخ : ۰۵ شهریور ۱۳۹۹ ، ساعت : ۰۵:۵۲ ق.ظ
سلام وقت بخیر
ممنون از اطلاع رسانی شما.
لطفا بفرمایید سیستم مدیریت محتوای شما چیست و چه نسخه ای ؟ جوملا یا ورد پرس ؟
پاسخ دادن | پاسخ همراه با نقل قول | نقل قول | گزارش به مدیر