การตรวจสอบความถูกต้องของเซสชันล้มเหลวใน Magento 1 EE v 1.14.3.x (และ CE 1.9.3.x)


18

ฉันกำลังดูแลร้านวีโอไอพีที่มีผู้เข้าชม 400-500 คนและสั่งซื้อ 40-50 ต่อวัน เมื่อเร็ว ๆ นี้ระบบได้รับการอัปเกรดจาก Magento EE 1.14.2.4 เป็น Magento EE 1.14.3.2 และฉันสังเกตเห็นข้อยกเว้นแปลก ๆ ในบันทึก:

exception 'Mage_Core_Model_Session_Exception' in
/var/www/.../app/code/core/Mage/Core/Model/Session/Abstract/Varien.php:418

ฉันกำลังไล่ล่าข้อยกเว้นนั้นและฉันรู้ว่ามันถูกไล่ออกเพราะรหัสตรวจสอบเซสชั่นต่อไปนี้ล้มเหลวในการตรวจสอบเซสชั่น:

class Mage_Core_Model_Session_Abstract_Varien extends Varien_Object
{
// ...
    protected function _validate()
    {
//    ...
        if ($this->useValidateSessionExpire()
            && isset($sessionData[self::VALIDATOR_SESSION_EXPIRE_TIMESTAMP])
            && $sessionData[self::VALIDATOR_SESSION_EXPIRE_TIMESTAMP] < time() ) {

if-block นี้ถูกเพิ่มลงในไฟล์พร้อมกับรีลีสล่าสุดจาก Magento และนี่คือการเปลี่ยนแปลงการเบรกอย่างเห็นได้ชัดดูรายละเอียดเพิ่มเติมด้านล่าง

ข้อยกเว้นเกิดขึ้นบ่อยเช่นวันละสิบครั้ง แต่ฉันไม่สามารถสร้างเงื่อนไขที่นำไปสู่ข้อยกเว้นได้อีกเว้นแต่ว่าฉันจะเป็นจริงในเงื่อนไขข้างต้น ข้อยกเว้นส่วนใหญ่เกิดขึ้นในหน้ารายละเอียดผลิตภัณฑ์และในขั้นตอนสุดท้ายของการชำระเงินหนึ่งหน้า ร้านค้าเป็นร้านค้า b2b ผู้ใช้จะต้องเข้าสู่ระบบเพื่อดูหน้าผลิตภัณฑ์หรือสามารถที่จะชำระเงินหมายความว่าผู้ใช้จะถูกเปลี่ยนเส้นทางไปยังหน้าเข้าสู่ระบบเมื่อเซสชั่นไม่ถูกต้อง / หมดอายุ ในขณะนี้มันสำคัญสำหรับฉันที่จะแก้ไขปัญหานี้ระหว่างเช็คเอาต์

เกิดอะไรขึ้นกับมุมมองของผู้ใช้: ผู้ใช้กรอกข้อมูลในรถเข็นดำเนินการชำระเงินและไปถึงขั้นตอนสุดท้ายจากนั้นเขา / เธอจะกดปุ่ม "ส่งคำสั่งซื้อ" และไม่มีอะไรเกิดขึ้น เบื้องหลัง JS ของ Magento ทำการร้องขอ AJAX และ JS คาดว่าจะได้รับ JSON กลับมา แต่ถ้าเกิดข้อผิดพลาดนี้ HTML ของหน้าเข้าสู่ระบบจะถูกส่งกลับซึ่ง JavaScript ไม่สามารถแยกวิเคราะห์ได้และไม่ทำอะไรเลย นั่นคือความสับสนอย่างมากสำหรับผู้ใช้

นั่นไม่ใช่สถานการณ์ที่สมบูรณ์ของผู้ใช้เราได้ติดต่อกับผู้ใช้และพวกเขาบอกเราว่าพวกเขารอสองสามวันระหว่างการกรอกรถเข็นและการส่งคำสั่งซื้อสิ่งที่หมายความว่ายากที่จะเข้าใจเพราะผู้คนจำไม่ได้

ระยะเวลาการใช้งาน PHP - 350000 (~ 4 วันในไม่กี่วินาที) อายุการใช้งานคุกกี้ - 345600 (4 วัน)

นี่คือคำถามจริง: ฉันจะทราบได้อย่างไรว่าพฤติกรรมของผู้ใช้ประเภทใดที่นำไปสู่ข้อยกเว้น

การปรับปรุง จนถึงตอนนี้ฉันรู้ว่ามีข้อยกเว้นเกิดขึ้นในชั้นเรียนต่อไปนี้ตามคำขอที่ทำกับฉันซึ่งหมายความว่าไม่มีอะไรน่าเสียดาย

/catalogsearch/result/?q=…    Mage_Core_Model_Session
/checkout/cart/               Mage_Core_Model_Session
/checkout/onepage/saveOrder/… Mage_Rss_Model_Session
/customer/account/loginPost/  Mage_Core_Model_Session
/customer/account/loginPost/  Mage_Reports_Model_Session
/customer/account/logout/     Mage_Reports_Model_Session
/catalog/product/view/…       Mage_Reports_Model_Session
/catalog/product/view/…       Mage_Tag_Model_Session

ปรับปรุง 2 : เซสชันถูกเก็บไว้ในไฟล์และล้างข้อมูลโดยตัวเก็บขยะเซสชัน PHP ไม่ว่าจะเป็นตัวเลือกที่ดีหรือไม่อยู่นอกขอบเขตของคำถามนี้


ที่เกี่ยวข้อง: maxchadwick.xyz/blog/…
Simon

คำตอบ:


24

หลังจากการดีบักขั้นสูงบางครั้งการติดตามเซสชั่นและการคิดเกี่ยวกับเวทมนต์ทั้งหมดนั้นฉันสามารถสร้างปัญหาขึ้นมาใหม่และเข้าใจเหตุผลได้ ฉันเตรียมภาพประกอบเวลาเล็กน้อยคุณสามารถดูได้ด้านล่าง

เวลาที่มีปัญหา

  • ธงสีแดงคือช่วงเวลาของการเข้าสู่ระบบของผู้ใช้และการสร้างเซสชัน
  • ธงฟ้าคือช่วงเวลาที่ผู้ใช้เปิดหน้าแคตตาล็อกสมมติว่าเป็นหน้าหมวดหมู่ที่เปิดขึ้น
  • ธงสีเขียวคือช่วงเวลาที่ผู้ใช้ส่งคำสั่งซื้อ ( /sales/order/save/...คำขอ)

นี่คือวิธีการทำซ้ำ:

  1. ก่อนที่คุณจะเริ่ม: ตั้งค่าการหมดเวลาเซสชันของ PHP และการหมดเวลาคุกกี้ของวีโอไอพีเป็น 1440 ซึ่งเป็นค่าเริ่มต้นของ PHP
  2. ฆ่าคุกกี้ทั้งหมดของคุณหรือเปิดแท็บไม่ระบุตัวตน
  3. ไปที่ร้านวีโอไอพีของคุณและเข้าสู่ระบบ (ดูธง 1)
  4. ผ่านแคตตาล็อกและเพิ่มผลิตภัณฑ์บางอย่างลงในตะกร้า (ตั้งค่าสถานะ 2)
  5. ผ่านการชำระเงินและส่งคำสั่งซื้อ จดบันทึกเวลาที่คุณทำ (ธง 3)
  6. ผ่านแคตตาล็อกและเพิ่มผลิตภัณฑ์บางอย่างลงในตะกร้า (ตั้งค่าสถานะ 4)
  7. รีเฟรชหน้ารถเข็นของคุณหรือผ่านหน้าแคตตาล็อกตราบใดที่การหมดเวลาที่คุณกำหนดค่าไว้สำหรับคุกกี้คุณภาพเยี่ยมนั้นหมดอายุ (ค่าสถานะ 5-6) โปรดทราบว่าเวลาระหว่างการตั้งค่าสถานะ 7 และตั้งค่าสถานะ 3 ควรมากกว่าเวลาหมดเวลาคุกกี้
  8. ผ่านการชำระเงินและส่งคำสั่งซื้อ (ตั้งค่าสถานะ 7) การส่งคำสั่งซื้อจะล้มเหลวเนื่องจากข้อยกเว้นที่อธิบายไว้ในคำถามของฉันด้านบน

เหตุผล:

มีบางเซสชันที่มีอินสแตนซ์เฉพาะกับคำขอที่กำหนดเท่านั้นเช่น Mage_Rss_Model_Sessionถูกสร้างอินสแตนซ์เฉพาะในระหว่างการชำระเงินจริงและไม่ได้เรียกดูผ่านแคตตาล็อก ในเวลาเดียวกันเซสชั่นหมดอายุเวลาจะถูกตั้งค่าเฉพาะเมื่อเซสชั่นได้รับการยกตัวอย่าง นั่นหมายความว่าหากมีเวลาเพียงพอระหว่างการชำระเงินสองครั้งและเซสชันไม่ถูกฆ่าในขณะเดียวกัน (เนื่องจากผู้ใช้ออกจากระบบหรือคุกกี้หมดอายุ) รหัส Magento ใหม่จะถือว่าเซสชันนั้นไม่ผ่านการตรวจสอบความถูกต้องและจะทำให้เกิดข้อยกเว้น ฉัน.

วิธีแก้ไข:

ฉันมีตัวเลือกน้อย:

  1. รอจนกระทั่ง Magento ตอบสนองต่อสิ่งนั้นและพิจารณารหัสนั้นอีกครั้ง
  2. ลบรหัสนี้ในขณะเดียวกัน
  3. ลองตั้งค่าการหมดเวลาของคุกกี้ Magento เป็น 0 หากเป็นตัวเลือกสำหรับคุณ

ฉันคิดออกยังไง:

  1. ฉันเริ่มต้นด้วยการเพิ่มสิ่งต่อไปนี้ลงในรหัสดั้งเดิมของ Mage_Core_Model_Session_Abstract_Varien

    Mage::log(
        sprintf(
            'useValidateSessionExpire fail "%s" "%d" "%d" "%s" "%s" "%s"',
            print_r($sessionData[self::VALIDATOR_SESSION_EXPIRE_TIMESTAMP], 1),
            time(),
            $this->_time,
            get_class($this),
            session_name(),
            session_id()
        ),
        Zend_Log::DEBUG,
        'session-validation.log',
        true
    );
    

    มันให้ข้อมูลเชิงลึกที่ดีเกี่ยวกับชั้นเรียนที่ได้รับผลกระทบและความสัมพันธ์ของพวกเขาและเซสชันสิ้นสุดลงเท่าใด แต่นั่นไม่ได้อธิบายว่าทำไมมันถึงเกิดขึ้นและการกระทำของผู้ใช้ที่นำไปสู่ปัญหา

  2. จากนั้นฉันเริ่มคิดว่าฉันจะติดตามการเปลี่ยนแปลงทั้งหมดของข้อมูลเซสชันได้อย่างไรและพบกับคำถามนี้/superuser/368231/automatic-versioning-upon-file-change-modify-create-delete ฉันตัดสินใจที่จะให้ ความพยายามgitและการincronรวมกัน แต่หลังจากที่ฉันนำไปใช้และทดสอบในแซนด์บ็อกซ์ฉันรู้ว่าฉันจะใช้พื้นที่ดิสก์ในการผลิตเร็วมาก

  3. ฉันตัดสินใจที่จะสร้างสคริปต์ PHP ขนาดเล็กซึ่งจะถอดรหัสข้อมูลเซสชันและเขียนบันทึกสำหรับแต่ละเซสชั่น สคริปต์นี้ถูกเรียกโดยincron

    <?php
    //log-session-data-change.php
    
    $sessionLogStoragePath = '/var/www/html/logged-session-storage/';
    
    $sessionFilePath = $argv[1];
    $sessionOperationType = $argv[2];
    $sessionFileName = basename($sessionFilePath);
    
    session_start();
    session_decode(file_get_contents($sessionFilePath));
    
    $logString = sprintf(
      '"%s","%s","%s",""' . PHP_EOL,
      date(DateTime::COOKIE),
      $sessionOperationType,
      $sessionFileName
    );
    
    if (file_exists($sessionFilePath)) {
      session_start();
      session_decode(file_get_contents($sessionFilePath));
    
      foreach ($_SESSION as $name => $data) {
        $value = '<empty>';
        if (isset($data['_session_validator_data']) && isset($data['_session_validator_data']['session_expire_timestamp'])) {
          $value = $data['_session_validator_data']['session_expire_timestamp'];
        }
        $logString .= sprintf(
          '"","","","%s","%s"' . PHP_EOL,
          $name,
          $value
        );
      }
    }
    
    file_put_contents($sessionLogStoragePath . $sessionFileName, $logString, FILE_APPEND);
    

    และนี่คือincrontabรายการที่สอดคล้องกัน

    /var/www/html/magento-doc-root/var/session IN_MODIFY,IN_CREATE,IN_DELETE,IN_MOVE /usr/bin/php /var/www/html/log-session-data-change.php $@/$# $%

    ตัวอย่างผลลัพธ์

    "Wednesday, 05-Apr-2017 18:09:06 CEST","IN_MODIFY","sess_94rfglnua0phncmp98hbr3k524",""
    "","","","core","1491408665"
    "","","","customer_base","1491408665"
    "","","","catalog","1491408665"
    "","","","checkout","1491408665"
    "","","","reports","1491408494"
    "","","","store_default","1491408665"
    "","","","rss","1491408524"
    "","","","admin","1491408524"
    

PS:

เวอร์ชันปัจจุบันของทั้งคู่

skin/frontend/enterprise/default/js/opcheckout.js 
src/skin/frontend/base/default/js/opcheckout.js

ไม่สามารถจัดการข้อยกเว้นด้านบนในระหว่างคำขอ AJAX พวกเขาแสดงอะไรกับผู้ใช้อย่างแท้จริงในขณะที่ผู้ใช้ออกจากระบบได้อย่างมีประสิทธิภาพ!

PPS:

เห็นได้ชัดว่าเวอร์ชันของ Magento CE 1.9.3.x ได้รับผลกระทบด้วยเช่นกันโปรดดูที่https://github.com/OpenMage/magento-mirror/blame/magento-1.9/app/code/core/Mage/Core/Model/Session/Abstract/ Varien.php

PPPS:

เมื่อฉันพูดว่า "ลบรหัสนี้ในขณะเดียวกัน" ฉันหมายถึงไม่รวมบล็อกต่อไปนี้

if ($this->useValidateSessionExpire()
    && isset($sessionData[self::VALIDATOR_SESSION_EXPIRE_TIMESTAMP])
    && $sessionData[self::VALIDATOR_SESSION_EXPIRE_TIMESTAMP] < time() ) {
    return false;
} else {
    $this->_data[self::VALIDATOR_KEY][self::VALIDATOR_SESSION_EXPIRE_TIMESTAMP]
        = $validatorData[self::VALIDATOR_SESSION_EXPIRE_TIMESTAMP];
}

คุณสามารถทำได้หลายวิธีรวมถึง:

  1. เพียงแค่ลบบิตนั้นออกจากไฟล์
  2. แสดงความคิดเห็นออกมา
  3. ก่อนกลับมา
  4. ทำให้$this->useValidateSessionExpire()ผลตอบแทนเป็นจริง
  5. ...
  6. มันคือการเขียนโปรแกรม - มีความคิดสร้างสรรค์;)

ฉันเพิ่งปิดการใช้งาน<Mage_Rss>และแก้ไขปัญหา (แก้ไขชั่วคราว) และได้ยื่นตั๋วด้วยการสนับสนุนคุณภาพเยี่ยม
Damodar Bashyal

1
@DamodarBashyal โปรดทราบว่าปัญหาไม่เพียงส่งผลกระทบต่อการชำระเงิน นอกจากนี้ยังมีผลต่อหน้าผลิตภัณฑ์ฉันเชื่อว่าหน้าอื่น ๆ อาจได้รับผลกระทบด้วย เหตุผล - ชุดเซสชั่นวัตถุที่แตกต่างกันจะเริ่มต้นได้ในทุกการกระทำของตัวควบคุมคุณภาพเยี่ยม ฉันสามารถให้คำอธิบายเพิ่มเติมหากจำเป็น
Anton Boritskiy

ฉันมีปัญหากับ API เมื่อสร้างการจัดส่งฉันได้รับข้อผิดพลาด อ่านก็โอเค แต่มีปัญหากับการเขียนจนกว่าจะถูกปิดใช้งาน ขอบคุณสำหรับข้อมูล
Damodar Bashyal

9

6. มันคือการเขียนโปรแกรม - มีความคิดสร้างสรรค์;)

อีกวิธีในการแก้ไขปัญหานี้ (และปรับปรุงการตรวจสอบเซสชัน)

ColinM @ https://github.com/OpenMage/magento-lts

ขณะนี้รหัสเซสชันเก็บข้อมูลตัวตรวจสอบความถูกต้องของเซสชันภายในทุกเนมสเปซและตรวจสอบความถูกต้องทุกครั้งที่มีการกำหนดเนมสเปซ สิ่งนี้ไม่ดีเพราะ:

  1. พื้นที่เก็บข้อมูลเซสชันไม่มีประสิทธิภาพมาก ข้อมูลตัวตรวจสอบความถูกต้องมักประกอบด้วยมากกว่า 50% ของพื้นที่ที่ใช้โดยเนมสเปซและเมื่อมีเนมสเปซมากมายสิ่งนี้จะเพิ่มของเสียจำนวนมาก ที่เก็บข้อมูลเซสชันสามารถตัดได้อย่างรวดเร็วด้วยแพตช์นี้และเมื่อใช้หน่วยความจำภายในเช่น Redis หรือ Memcached ซึ่งมีความสำคัญมาก
  2. การคำนวณรอบที่ไม่มีประสิทธิภาพเนื่องจากหลายเนมสเปซหมายถึงการตรวจสอบหลายครั้งและไม่มีเหตุผลที่ดีที่สิ่งเหล่านี้จะแตกต่างจากกัน
  3. สร้างข้อบกพร่องที่เกิดขึ้นจริงเช่น# 394ซึ่งข้อมูลตัวตรวจสอบความถูกต้องได้รับการอัปเดตในคำขอบางอย่าง แต่ไม่ใช่อื่น ๆ (เพื่อให้สามารถแตกต่างกันได้ แต่ไม่ควร) ฉันยังไม่ได้ทดสอบ แต่ฉันเชื่อว่านี่จะแก้ไขปัญหานี้ได้เช่นกัน
diff --git a/app/code/core/Mage/Core/Model/Session/Abstract/Varien.php b/app/code/core/Mage/Core/Model/Session/Abstract/Varien.php
index 45d736543..ea6b464f1 100644
--- a/app/code/core/Mage/Core/Model/Session/Abstract/Varien.php
+++ b/app/code/core/Mage/Core/Model/Session/Abstract/Varien.php
@@ -35,6 +35,9 @@ class Mage_Core_Model_Session_Abstract_Varien extends Varien_Object
     const VALIDATOR_SESSION_EXPIRE_TIMESTAMP    = 'session_expire_timestamp';
     const SECURE_COOKIE_CHECK_KEY               = '_secure_cookie_check';

+    /** @var bool Flag true if session validator data has already been evaluated */
+    protected static $isValidated = FALSE;
+
     /**
      * Map of session enabled hosts
      * @example array('host.name' => true)
@@ -406,16 +409,21 @@ public function getValidateHttpUserAgentSkip()
     /**
      * Validate session
      *
-     * @param string $namespace
+     * @throws Mage_Core_Model_Session_Exception
      * @return Mage_Core_Model_Session_Abstract_Varien
      */
     public function validate()
     {
-        if (!isset($this->_data[self::VALIDATOR_KEY])) {
-            $this->_data[self::VALIDATOR_KEY] = $this->getValidatorData();
+        // Backwards compatibility with legacy sessions (validator data stored per-namespace)
+        if (isset($this->_data[self::VALIDATOR_KEY])) {
+            $_SESSION[self::VALIDATOR_KEY] = $this->_data[self::VALIDATOR_KEY];
+            unset($this->_data[self::VALIDATOR_KEY]);
+        }
+        if (!isset($_SESSION[self::VALIDATOR_KEY])) {
+            $_SESSION[self::VALIDATOR_KEY] = $this->getValidatorData();
         }
         else {
-            if (!$this->_validate()) {
+            if ( ! self::$isValidated && ! $this->_validate()) {
                 $this->getCookie()->delete(session_name());
                 // throw core session exception
                 throw new Mage_Core_Model_Session_Exception('');
@@ -432,8 +440,9 @@ public function validate()
      */
     protected function _validate()
     {
-        $sessionData = $this->_data[self::VALIDATOR_KEY];
+        $sessionData = $_SESSION[self::VALIDATOR_KEY];
         $validatorData = $this->getValidatorData();
+        self::$isValidated = TRUE; // Only validate once since the validator data is the same for every namespace

         if ($this->useValidateRemoteAddr()
                 && $sessionData[self::VALIDATOR_REMOTE_ADDR_KEY] != $validatorData[self::VALIDATOR_REMOTE_ADDR_KEY]) {
@@ -444,10 +453,8 @@ protected function _validate()
             return false;
         }

-        $sessionValidateHttpXForwardedForKey = $sessionData[self::VALIDATOR_HTTP_X_FORVARDED_FOR_KEY];
-        $validatorValidateHttpXForwardedForKey = $validatorData[self::VALIDATOR_HTTP_X_FORVARDED_FOR_KEY];
         if ($this->useValidateHttpXForwardedFor()
-            && $sessionValidateHttpXForwardedForKey != $validatorValidateHttpXForwardedForKey ) {
+                && $sessionData[self::VALIDATOR_HTTP_X_FORVARDED_FOR_KEY] != $validatorData[self::VALIDATOR_HTTP_X_FORVARDED_FOR_KEY]) {
             return false;
         }
         if ($this->useValidateHttpUserAgent()

ที่มา: https://github.com/OpenMage/magento-lts/commit/de06e671c09b375605a956e100911396822e276a


ปรับปรุง:

แก้ไขweb/session/use_http_x_forwarded_for optionตัวเลือกที่ถูกปิดใช้งาน ... https://github.com/OpenMage/magento-lts/pull/457/commits/ec8128b4605e82406679c3cd81244ddf3878c379


1
นั่นดูดีจริง ๆ แล้วประสบการณ์การใช้งานในการผลิต
Anton Boritskiy

@AntonBoritskiy ใช่ฉันใช้มันในการผลิต ทำงานได้สมบูรณ์แบบ
sv3n

sv3n มีด้านใดที่อาจเป็นไปได้ในวิธีการแก้ปัญหานี้หรือไม่?
Vaishal Patel

@VaishalPatel หากมีด้านใด ๆ ที่อาจเกิดขึ้นฉันไม่เห็นพวกเขาจริง ๆ :) ฉันใช้สิ่งนี้ในการผลิตและแก้ไขปัญหาการตรวจสอบเซสชันทั้งหมด ฉันจะไม่โพสต์นี้ถ้าผมมีความกังวลใด ๆ แต่ถ้าคุณมีข้อสงสัยกรุณาสอบถามที่นี่: github.com/OpenMage/magento-lts/pull/406 บางที "มืออาชีพ" SE บางคนอาจมีเวลาทบทวนบ้างไหม?
sv3n

ฉันจะใส่ในการผลิตของฉัน ไม่ว่าจะด้วยวิธีใดก็ตาม
Vaishal Patel

1

คุณจัดเก็บเซสชันอย่างไร (เช่นใน var / session / หรือในฐานข้อมูลหรือใช้เอ็นจินการแคชอื่น ๆ เช่น Redis หรือ Memcached)

ไม่ว่าคุณจะใช้งานแบบใดให้แน่ใจว่าสิทธิ์การเขียนของคุณถูกต้องvar/session/(โดยปกติจะตั้งไว้ที่ 755 สำหรับ dirs และ 644 สำหรับไฟล์) หรือหากคุณใช้ Redis หรือ Memcache ตรวจสอบให้แน่ใจว่าการตั้งค่าการเชื่อมต่อและหมดเวลา .

Inchoo มีบทช่วยสอนที่ดีสำหรับ Redis: http://inchoo.net/magento/using-redis-cache-backend-and-session-storage-in-magento/

หากใช้ Memcache ให้ชำระเงินบทความนี้ (อ้างอิง v1.10 แต่ไม่ควรแตกต่างกันมาก): http://www.magestore.com/magento/magento/magento-sessions-disappearing-with-memcache-turned-on.html

นอกจากนี้หากคุณเคยใช้บางสิ่งบางอย่างเช่นวานิชมีปัญหาในอดีตที่มีเซสชันที่ต้องการเจาะรูหน้าบางหน้า

สุดท้ายหากคุณใช้ระบบไฟล์สำหรับเซสชันของคุณคุณอาจรู้สึกโล่งใจเพียงแค่เปลี่ยน<session_save>โหนดในของคุณlocal.xmlเป็น "db" แทน "files"

จากนี้ <session_save><![CDATA[files]]></session_save>

สำหรับสิ่งนี้ <session_save><![CDATA[db]]></session_save>


ขอบคุณสำหรับคำแนะนำ - ฉันควรเพิ่มข้อมูลลงในคำถามเกี่ยวกับฉันจะเก็บเซสชันได้อย่างไรฉันเก็บไว้ในไฟล์ ฉันเพิ่งค้นพบปัญหาเดิมฉันคิดว่าข้อผิดพลาดของวีโอไอพี ฉันจะสรุปและโพสต์คำตอบในไม่ช้า
Anton Boritskiy

เยี่ยมมาก! ... คำตอบของฉันช่วยได้ด้วยวิธีแก้ปัญหาเหรอ?
gtr1971

ไม่จริง - ดูคำตอบของฉัน
Anton Boritskiy

0

รายละเอียดของ Anton Boritskiy นั้นยอดเยี่ยมมาก แต่แทนที่จะยกเว้นบล็อกนี้คุณสามารถสร้างสำเนาในเครื่องเพื่อที่คุณจะไม่ได้แก้ไขแกนและเขียนบล็อกใหม่เช่น:

if ($this->useValidateSessionExpire() ) {
    // If the VALIDATOR_SESSION_EXPIRE_TIMESTAMP key is not set, do it now
    if( !isset($sessionData[self::VALIDATOR_SESSION_EXPIRE_TIMESTAMP]) ) {
        // $this->_data is a reference to the $_SESSION variable so it will be automatically modified
        $this->_data[self::VALIDATOR_SESSION_EXPIRE_TIMESTAMP] = time() + $this->getCookie()->getLifetime();
        return true;
    } elseif ( $sessionData[self::VALIDATOR_SESSION_EXPIRE_TIMESTAMP] < time() ) {
        return false;
    }
} else {
    $this->_data[self::VALIDATOR_KEY][self::VALIDATOR_SESSION_EXPIRE_TIMESTAMP]
        = $validatorData[self::VALIDATOR_SESSION_EXPIRE_TIMESTAMP];
}

สิ่งนี้ทำให้มั่นใจได้ว่าการเปรียบเทียบระหว่าง time () และ session_expire_timestamp จะดำเนินการเฉพาะเมื่อคีย์มีอยู่และเมื่อพบเซสชันที่ไม่มีคีย์ (เช่นเซสชัน 1.9.3 ก่อน) จะมีการเพิ่มคีย์


การเพิ่มการคัดลอกและการเอาชนะในเครื่องนั้นเป็นวิธีที่ดีกว่าจากนั้นทำการแก้ไขไฟล์หลักเรายังคงรักษารายการของชุดข้อมูลที่จะถูกนำไปใช้โดยอัตโนมัติในระหว่างการสร้างโครงการทำให้ Magento ปล่อยข้อบกพร่องสองสามแบบ
Anton Boritskiy

ในขณะเดียวกันฉันไม่เห็นว่าการเปลี่ยนแปลงของคุณแก้ไขปัญหาดั้งเดิมได้อย่างไรสามารถเพิ่มคำอธิบายที่ขยายเพิ่มเติมอีกเล็กน้อยได้ไหม
Anton Boritskiy

Anto Boritskiy นั่นคือเสียงที่ดีกับรายการ
Vaishal Patel

Anto Boritskiy คีย์ใหม่จะใช้ในการตรวจสอบความถูกต้องของการประทับเวลาของเซสชัน $ sessionData มาจาก $ this -> _ data [self :: VALIDATOR_KEY]; แต่คีย์ session_expire_timestamp จะถูกเพิ่มไปยังเซสชันโดย $ this-> getValidatorData (); ฟังก์ชั่นและเก็บไว้ใน $ this -> _ data [... ] ในตอนท้ายของการเรียกใช้ฟังก์ชัน ดังนั้นปัญหาคือว่าในเซสชั่นที่มีอยู่นี้กุญแจ session_expire_timestamp ไม่สามารถใช้ได้
Vaishal Patel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.