วานิชและน้ำมันสน


9

ฉันพบว่าเมื่อใดก็ตามที่ฉันเริ่ม Varnish บนเซิร์ฟเวอร์ของฉันฉันจะสูญเสียเซสชันของฉันสำหรับผู้ใช้ของฉัน

นี่คือการทำให้ลูกค้าของฉันหลวมตะกร้าสินค้า

นี่เป็นพฤติกรรมปกติของวานิชหรือ VCL ของฉันจะตำหนิหรือไม่ ดูเหมือนว่ามันจะไม่


ข้อมูลเพิ่มเติม

ในการตรวจสอบเพิ่มเติมปรากฏว่าปัญหานี้เกี่ยวข้องกับปัญหา # 725ใน GitHub

การติดตั้ง Magento ของฉันคือรุ่น 1.9.1.0 มันก็ควรจะกล่าวว่าส่วนหน้าทั้งหมดของฉันกำลังทำงานภายใต้ https ฉันใช้ปอนด์ต่อหน้าวานิชเพื่อยกเลิก SSL

ปรากฏว่าพฤติกรรมวีโอไอพีเริ่มต้นในรุ่นนี้คือการสร้างคุกกี้ส่วนหน้ารองซึ่งมักจะเรียกว่า 'frontend_cid' ในความพยายามที่จะทดสอบการโจมตีของ MITM

ดูเหมือนว่าไฟล์ VCL ที่สร้างขึ้นโดย Turpentine ไม่ได้ส่งผ่านคุกกี้นี้ซึ่งก่อให้เกิดเซสชันที่ไม่ถูกต้อง

ใครสามารถอธิบายได้ว่าไฟล์ VCL ส่งผ่านคุกกี้ที่ Magento ทำต่อลูกค้าได้อย่างไร


ฉันได้ทำให้แคบลงเพื่อวานิชไม่ได้สร้างคุกกี้ที่จำเป็น

ตั้งแต่ Magento 1.9.1.0 มีการแนะนำคุกกี้ 'frontend_cid' เพื่อป้องกันการโจมตีของ MITM

สามารถพบได้ในMage_Core_Model_Session_Abstract_Varienชั้นเรียนที่บรรทัดที่ 135

if (Mage::app()->getFrontController()->getRequest()->isSecure() && empty($cookieParams['secure'])) {
    // secure cookie check to prevent MITM attack
    $secureCookieName = $sessionName . '_cid';
    if (isset($_SESSION[self::SECURE_COOKIE_CHECK_KEY])
        && $_SESSION[self::SECURE_COOKIE_CHECK_KEY] !== md5($cookie->get($secureCookieName))
    ) {
        session_regenerate_id(false);
        $sessionHosts = $this->getSessionHosts();
        $currentCookieDomain = $cookie->getDomain();
        foreach (array_keys($sessionHosts) as $host) {
            // Delete cookies with the same name for parent domains
            if (strpos($currentCookieDomain, $host) > 0) {
                $cookie->delete($this->getSessionName(), null, $host);
            }
        }
        $_SESSION = array();
    }
    if (!isset($_SESSION[self::SECURE_COOKIE_CHECK_KEY])) {
        $checkId = Mage::helper('core')->getRandomString(16);
        $cookie->set($secureCookieName, $checkId, null, null, null, true);
        $_SESSION[self::SECURE_COOKIE_CHECK_KEY] = md5($checkId);
    }
}

เพื่อให้การเชื่อมต่อที่ปลอดภัยสำหรับลูกค้าวานิชต้องสร้างคุกกี้ 'ส่วนหน้า' ซึ่งวีโอไอพีจะใช้ในการระบุลูกค้ารายนั้นในภายหลัง จนถึงตอนนี้ดูเหมือนว่าจะทำได้ดี อย่างไรก็ตามดูเหมือนว่า Magento 1.9.1.0 ตอนนี้มันต้องสร้างคุกกี้ 'frontend_cid' ด้วย

วานิชต้องทำเช่นนี้เพราะโดยแคชการตอบสนองก็ยังแคชส่วนหัวการตอบสนองซึ่งมีคุกกี้ 'ส่วนหน้า'

ดังนั้นโดยค่าเริ่มต้น Varnish จะระเบิดคุกกี้ที่แบ็กเอนด์ตอบกลับเมื่อจัดการกับเงื่อนไข 'ค้นหา' หรือ 'ผ่าน' มันเป็นการหยุดผู้ใช้หลายคนด้วยคุกกี้ส่วนหน้าแคชเดียวกัน (ซึ่งจะทำให้การประชุมประชาชน)

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

Turpentine VCL จะ 'ไปป์' คำขอใด ๆ ที่ไม่ได้เป็นประเภทวิธี GET หรือ HEAD ตามที่เห็นโดยรหัสนี้ในการvcl_recvทำงาน:

// We only deal with GET and HEAD by default
// we test this here instead of inside the url base regex section
// so we can disable caching for the entire site if needed
if (!true || req.http.Authorization ||
    req.request !~ "^(GET|HEAD)$" ||
    req.http.Cookie ~ "varnish_bypass=1") {
    return (pipe);
}

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


จะแก้ไขอย่างไร

ฉันเชื่อว่าวิธีแก้ไขปัญหานี้คือการให้ Turpentine VCL สร้างคุกกี้ 'frontend_cid' สำหรับผู้เยี่ยมชมที่เข้ามาแล้วให้โมดูล turpentine เพิ่มคุกกี้นั้นลงในเซสชันปัจจุบันเช่นเดียวกับคุกกี้ 'frontend'

ดังนั้น ... เราจะใช้สิ่งนี้ได้อย่างไร

Caveat: ฉันอาจจะผิดฉันยังใหม่มากกับ Varnish แต่ตอนนี้ฉันใช้เวลาไปหลายชั่วโมงแล้วและนี่คือสิ่งที่ฉันเห็นผู้สนับสนุนทุกคนในตอนนี้จะได้รับการชื่นชมอย่างมาก

การปรับปรุงครั้งสุดท้ายและการแก้ไขของฉัน CHOSEN - 2015 10 30

เป็นไปไม่ได้ที่จะสร้างคุกกี้ 'frontend_cid' ในวานิชเนื่องจาก Magento จะสร้างคุกกี้แบบสุ่มบนเซิร์ฟเวอร์และเก็บไว้เป็น MD5 แฮชในเซสชันลูกค้า สิ่งนี้จะหยุดคุณจากการสร้างภายนอกเซสชันลูกค้า

ทางออกที่ดีที่สุดที่ฉันพบในเรื่องนี้คือการเขียนทับวิธีที่วีโอไอพีจัดการกับเซสชันของลูกค้า

ปัจจุบัน Magento จัดการกับเซสชันที่ไม่ถูกต้องเช่นนี้:

IF
    The requested session by the customer is flagged as invalid
THEN
    Stop processing request
    Redirect to the appropriate page

ตรรกะใหม่ของฉันไปดังนี้:

IF
    The requested session by the customer is flagged as invalid
THEN
    Create a new session
    Complete the requested task
    Redirect to the appropriate page

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


My Issue, Issue # 829 - / nexcess / magento-turpentine / problems / 829 บน GitHub สำเนา VCL ของฉันสามารถพบได้ที่นี่


ปัญหาของฉันใน GitHub ถูกปิดเนื่องจากเป็นปัญหาที่เก่ากว่ามากที่พบที่นี่:

ปัญหา # 345


1
ฉันเห็นคุณเพิ่งเปิดปัญหา GitHub ฉันจะตรวจสอบพรุ่งนี้ตอนเช้า ในขณะเดียวกันคุณสามารถตรวจสอบgithub.com/nexcess/magento-turpentine/issues/90และgithub.com/nexcess/magento-turpentine/issues/92
mbalparda

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

คำตอบ:


4

อาจเกิดจากการตั้งค่าเส้นทางคุกกี้ของคุณไม่ถูกต้อง

ลองตั้งค่าการตั้งค่าคุกกี้Admin->Configuration->Web->Session Cookie Managementหากยังไม่ได้ตั้งค่า

หรืออาจเป็นข้อผิดพลาดในการเคลือบเงา


ขอบคุณ @ รูปแบบดิจิตอลฉันได้ทำการตรวจสอบเพิ่มเติมและกำลังปรับปรุงคำถามของฉัน
ปีเตอร์ A

1

ฉันสงสัยว่าปัญหาของคุณจะได้รับการแก้ไขโดยการอัปเดตของ Turpentine ล่าสุด: https://github.com/nexcess/magento-turpentine/commit/66615b7cc987854e8671911ab6c3aa22afb808a2

การลบการสร้างเซสชันลบปัญหา # 806, # 345 และอื่น ๆ อีกมากมายที่เกี่ยวข้องกับเซสชันเพิ่มเติมเกวียนว่างเปล่า ฯลฯ

ทำให้สารเคลือบเงาถูกบายพาสในการโหลดหน้าแรกสำหรับเซสชันใหม่

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

เราพบว่าการเปลี่ยนแปลงนี้ได้แก้ไขปัญหานี้สำหรับลูกค้า Magento ของเราจำนวนหนึ่ง (เราเรียกใช้www.section.io )


1
ขอบคุณ @mattnthat ฉันรู้วิธีการแก้ปัญหาที่เสนอ แต่ฉันไม่พบว่ามันเป็นที่ยอมรับ ฉันลงเอยด้วยการนำโซลูชันอื่นมาใช้ ฉันตรวจสอบวีโอไอพีว่าเซสชันนั้นถูกต้องหรือไม่และหากไม่ใช่แทนที่จะเลิกใช้สคริปต์ฉันได้กำหนดให้เริ่มต้นเซสชันใหม่และทำตามคำขอให้เสร็จสมบูรณ์
ปีเตอร์ A
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.