ฉันพบว่าเมื่อใดก็ตามที่ฉันเริ่ม 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 ถูกปิดเนื่องจากเป็นปัญหาที่เก่ากว่ามากที่พบที่นี่: