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

در 11 بهمن 1399.

maxresdefault

 

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

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

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

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

مشکل چه بود؟

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

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

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

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

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

راه حل چیست ؟

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

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

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

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

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

 

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

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

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

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

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

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

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

راه حل ویژه سایت‌های جوملا:

در سایت‌های جوملایی برای رفع این مشکل یک راه حل بسیار ساده وجود دارد که برای انجام آن ابتدا حتما باید برای سایتتان گواهی ssl را (همانطور که در بالا گفته شد!) فعال نمایید.

پس از اطمینان از این که گواهی SSL در هاستتان فعال شده از طریق مدیریت جوملا / منوی سیستم / گزینه تنظیمات کلی  را انتخاب کنید سپس در زبانه سیستم گزینه استفاده از HTTPS را بر روی همه سایت قرار دهید و ذخیره کنید.

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

در مرحله بعد از طریق مدیریت جوملا / منوی سیستم / گزینه تنظیمات کلی در زبانه سایت گزینه مسیر کوکی (یا Cookie Path) را پیدا نموده و کد زیر را در آن مقدار دهی نموده و سپس ذخیره نمایید.

/; SameSite=None

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

در صورت بروزمشکل پس از انجام موارد بالا چه کنیم ؟

اگر پس از انجام مراحل بالا به مشکلاتی مثل عدم امکان ورود به مدیریت جوملا یا عدم مشاهده سایت و ... برخوردید و نمی توانید مجددا به تنظیمات مراجعه نموده و تنظیمات را به حالت اول برگردانید می توانید از طریق روش زیر این تنظیمات را به حالت اول برگردانید:

از طریق بخش فایل های سایت به پوشه اصلی سایتتان مراجعه نموده و فایل configuration.php را باز نمایید. واژه های cookie_path را جستجو کنید و کل خطی که این واژه در آن قرار دارد را انتخاب نموده و خط زیر را جایگزینه آن کنید:

public $cookie_path = '';

در همان فایل configuration.php مجددا واژه force_ssl را جستجو نمایید و کد خطی که این واژه در آن قرار دارد را انتخاب نموده و خط زیر را جایگزینه آن کنید:

public $force_ssl = '0';

با انجام این موارد تنظیمات سایتتان به حالت اول بر می گردد سپس با پشتیبانی گروه جومی تماس بگیرید تا علت مشکل را برایتان بررسی کنند.

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

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

در وردپرس برای رفع این مشکل پلاگینی منتشر شده است قبل از استفاده از دیگر راه حل های ما پیشنهاد می کنیم پلاگین 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 است و لازم است کد را پاک نموده و مرحله بعد را تست کنید.

راه حل دوم:

این راه حل برای سایت هایی که به زبان php طراحی شده اند می باشد.

در ابتدا مطمئن شوید که گواهی SSL برای دامنه شما فعال می باشد و استفاده از HTTPS برای تمام بخش های سایت از جمله بخش مدیریت و بخش کاربری اجباری می باشد.

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

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

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

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

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

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

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

ارسال نظر


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

نظرات  

 
+2 # علی 70 در تاریخ : ۲۱ اسفند ۱۳۹۹ ، ساعت : ۱۱:۳۳ ق.ظ
برای من درست شد و حالا باید چند روز منتظر بمونم تا کاربرهای مختلف خرید کنن و ببینم باز به مشکل برمیخوره یا نه

ممنون بابت این راهکار و اشتراک گذاری تجربتون
پاسخ دادن | پاسخ همراه با نقل قول | نقل قول | گزارش به مدیر
 
 
0 # نکار حاجی زاده در تاریخ : ۱۶ اسفند ۱۳۹۹ ، ساعت : ۰۴:۲۰ ب.ظ
من تمام کارهایی که نوشتین رو انجام دادم ولی همچنان پرداخت ناموفق برمیگرده و SameSite=None نمیشه
ولی تو فایر فاکس SameSite=None هست هم تراکنش ناموفق هست
پاسخ دادن | پاسخ همراه با نقل قول | نقل قول | گزارش به مدیر
 
 
0 # حمیدرضا ذوالفقار در تاریخ : ۱۷ اسفند ۱۳۹۹ ، ساعت : ۰۷:۴۴ ق.ظ
با سلام
آدرس سایتتان را برای من ایمیل کنید تا برایتان بررسی کنم.
پاسخ دادن | پاسخ همراه با نقل قول | نقل قول | گزارش به مدیر
 
 
0 # حسن دادخواه در تاریخ : ۰۹ آذر ۱۳۹۹ ، ساعت : ۰۷:۳۴ ق.ظ
در روش دوم اصلا لاگین نمیشه
پاسخ دادن | پاسخ همراه با نقل قول | نقل قول | گزارش به مدیر
 
 
0 # حمیدرضا ذوالفقار در تاریخ : ۰۴ بهمن ۱۳۹۹ ، ساعت : ۰۲:۰۸ ب.ظ
با سلام
پیش نیاز اعمال نمودن SameSite=None فعال بودن گواهی SSL و اجباری بودن HTTPS در تمام بخش های سایت می باشد.
مقاله بالا بروزرسانی شده و راه حل های جدید اضافه شده است.
موفق باشید.
پاسخ دادن | پاسخ همراه با نقل قول | نقل قول | گزارش به مدیر
 
 
+2 # محمدعلی حجار در تاریخ : ۲۴ مهر ۱۳۹۹ ، ساعت : ۰۸:۰۸ ق.ظ
با سلام
ضمن تشکر از بررسی های فنی و اقدامات خوبی که انجام دادین. به اطلاع میرساند مشکل من با راه حل دوم رفع گردید.
با سپاس
پاسخ دادن | پاسخ همراه با نقل قول | نقل قول | گزارش به مدیر
 
 
+7 # امین دشتی در تاریخ : ۰۴ مهر ۱۳۹۹ ، ساعت : ۰۸:۳۰ ب.ظ
سلام
ممنون بابت اشتراک گزاری مطلب
راستش چند ماهی بود درگیر بودم و آخر سر داشتم به این نتیجه میرسیدم که ایراد از هسته وردپرس باید باشه!
جهت تکمیل مطلب فوق منم تجربیات خودمو بهش اضافه میکنم
راهکار اولی که ارائه کردید صرفا در وب سرورهای آپاچی قابل انجام هست و روی یکی از سایتهای من نتیجه مثبت داد، اما وب سرورهای لایت اسپید این کدرو نمیتونن اجرا کنن
برای وب سرورهای لایت اسپید اگر نسخه 5.4.9 build 2 به بعد باشن باید ForceSecureCook ie secure same_site_none داخل تگ در فایل htaccess استفاده بشه در غیر اینصورت باید داخل php.ini از کد session.cookie_ samesite = None استفاده بشه که اونم در اکثریت سرورها مسدود شده!
درکل میشه گفت نمیشه در سرور لایت اسپید بدون همکاری هاستینگ کاری انجام داد!
در مورد راهکار دومی که ارائه کردید من روی وردپرس به طرق مختلف (از جمله action init و فایل index.php) تست کردم اما نتیجه نداد متاسفانه
پاسخ دادن | پاسخ همراه با نقل قول | نقل قول | گزارش به مدیر
 
 
0 # حمیدرضا ذوالفقار در تاریخ : ۰۴ بهمن ۱۳۹۹ ، ساعت : ۰۲:۰۹ ب.ظ
با سلام
مقاله بالا بروزرسانی شده و راه حل های جدید اضافه شده است.
برای وردپرس هم یک راه حل جدید اضافه شد.
پیشنهاد می کنم مقاله را مجددا مطالعه کنید جزئیات بیشتری اضافه شده است.
موفق باشید.
پاسخ دادن | پاسخ همراه با نقل قول | نقل قول | گزارش به مدیر
 
 
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 جزو پیش شرط های اصلی این مورد می باشد.
مقاله را مجددا مطالعه نمایید.
پاسخ دادن | پاسخ همراه با نقل قول | نقل قول | گزارش به مدیر
 
 
+1 # sharifsoft در تاریخ : ۱۳ شهریور ۱۳۹۹ ، ساعت : ۰۸:۵۹ ق.ظ
سلام
واقعا ممنونم از اطلاعاتي كه منتشر كرديد
حدود دو هفته به در و ديوار ميزدم كه مشكل رو حل كنم ولي هيچي به هيچي
پذيرنده ها هم همگي بجز به پرداخت ملت از اساس منكر قضيه بودند
من روش httpaccess رو انجام دادم و فعلا مشكل حل شده
خيلي خيلي ممنون
پاسخ دادن | پاسخ همراه با نقل قول | نقل قول | گزارش به مدیر
 
 
+2 # Payam در تاریخ : ۰۵ شهریور ۱۳۹۹ ، ساعت : ۰۵:۲۵ ق.ظ
باسلام و خسته نباشید
کدهای اعلامی را من در .htaccess قراردادم و تمام درگاه ها را چک کردم و تا این لحظه میتونم بگویم مشکل برطرف شده است من تمامی درگاه ها را دارم که از کار افتاده بودند ولی الان دارند تراکنش را موفق انجام میدهند
با تشکر و احترام
پاسخ دادن | پاسخ همراه با نقل قول | نقل قول | گزارش به مدیر
 
 
+1 # حمیدرضا ذوالفقار در تاریخ : ۰۵ شهریور ۱۳۹۹ ، ساعت : ۰۵:۵۲ ق.ظ
سلام وقت بخیر
ممنون از اطلاع رسانی شما.
لطفا بفرمایید سیستم مدیریت محتوای شما چیست و چه نسخه ای ؟ جوملا یا ورد پرس ؟
پاسخ دادن | پاسخ همراه با نقل قول | نقل قول | گزارش به مدیر