Trường hợp tò mò của trình trang trí điều hướng ảo tấn công bộ đệm EE của Magento


12

Hãy sẵn sàng cho một điều kỳ lạ. Vì vậy, tôi đang tùy chỉnh điều hướng danh mục chính để xây dựng hành vi UI toàn trạng thái xử lý nhiều mô hình tương tác (menu, menu thả xuống, phương thức, v.v.) trên các thiết bị. Giống như bạn làm.

Điều đó có nghĩa là ghi đè lớp / phương thức này:

app/code/core/Mage/Page/Block/Html/Topmenu.php :: _getHtml()

Để tạo đầu ra HTML như thế này (phần nào đơn giản hóa):

<ul class="nav-list">
    <li class="nav-1">
        <a data-ui-action="nav-1" href="#">Bazzow</a>
        <div class="menu"> ... </div>
    </li>

    <li class="nav-2">
        <a data-ui-action="nav-2" href="#">Bazinga</a>
        <div class="menu"> ... </div>
    </li>
</ul>

Bây giờ, điều này là khá nhàm chán / tiêu chuẩn ngoại trừ data-ui-actionthuộc tính. Đó là nơi xảy ra phép thuật JS. Bất kỳ nhấp chuột nào vào các yếu tố với thuộc tính đó đều cập nhật trạng thái UI. Bạn đoán nó, li.nav-Xlớp (mà Magento thêm vào) hoạt động như cái móc của tôi để liên kết trạng thái UI với phần tử được kích hoạt.

Tất cả đều tốt, phải không? Bật bộ đệm EE. Tất cả đều tốt phải không? Sai lầm.

Nếu trang bạn đang xem nằm trong hệ thống phân cấp danh mục của Bazeda (aka nav-2), thì đột nhiên bạn sẽ thấy điều này:

data-ui-action="nav-2 active"

Ai thêm activechuỗi khó chịu ? Kẻ lừa đảo là ai.

Và bây giờ trạng thái UI của bạn không thành công, vì giá trị của thuộc tính dữ liệu không còn phù hợp với <li>lớp nữa. Săn lùng bóng ma.

Săn

  1. Trước tiên, bạn kiểm tra xem trong bộ đệm EE, biến $child->getPositionClass()đầu ra nav-2không thực sự có các giá trị lớp khác (có lẽ) được nối thêm. Nó không.

  2. Bạn kiểm tra xem một trong nhiều tập lệnh JS trang trí của Magento không thực thi trong danh sách điều hướng. Nó không thể.

  3. Có lẽ đó thực sự là một điều kỳ lạ /js/varien/menu.js. Nhưng bạn đã loại trừ các tập lệnh cốt lõi như bạn luôn làm.

  4. Có lẽ đó là một số JS nội tuyến điên rồ mà bạn không bao giờ biết một mô-đun kết xuất từ ​​lớp PHP. Tìm kiếm nguồn trang activetrong <script>thẻ. Bạn không tìm thấy gì.

  5. Có thể đó là một số JS Magento điên khùng khác yêu cầu nhưng tải bên ngoài. Bạn vô hiệu hóa JS trong trình duyệt, nhưng cuộc sống ảo.

  6. Bạn quay trở lại Topmenu.phplớp học và loại bỏ thuộc tính dữ liệu. Vấn đề dừng lại. Cái quái gì thế.

  7. Bạn tự hỏi nếu một thuộc tính khác trên cùng một phần tử không được trích dẫn chính xác (hey, rất nhiều lớp bổ sung xảy ra trong đó). Vì vậy, bạn trao đổi thứ tự của các thuộc tính và loại bỏ chúng trong sự kết hợp khác nhau. Không có con xúc xắc. Nếu thuộc tính dữ liệu có mặt, thì bóng ma cũng vậy.

  8. Bạn tự hỏi nếu không phải lớp PHP này đang thực hiện thì sao? Có một page_block_html_topmenu_gethtml_aftersự kiện được gửi đi một cái gì đó khác có thể sử dụng để hack đánh dấu từ bên ngoài. Không có gì.

  9. Gì. Là. Đang xảy ra. Đây.

Câu trả lời

Giải thích tất cả những điều đó cho các nhà phát triển phụ trợ. Mọi người hành động bối rối. Cho đến khi ...

Câu trả lời:


10

Ai đó mở ra vết nứt:

app/code/core/Enterprise/PageCache/Model/Container/Catalognavigation.php
Method: saveCache()
Line 107

Bạn thấy một biểu hiện nhỏ khó chịu thường xuyên:

if (preg_match('/(?<=\s|^)nav-.+?(?=\s|$)/', $classValue, $matches)) {
    $categoryUniqueClasses .= ($categoryUniqueClasses ? ' ' : '') . $matches[0];
}

Đó là phù hợp với một số ác quỷ cho nav-trong này <li>. Chỉ để bạn nhớ:

<li class="nav-1">
    <a data-ui-action="nav-1" href="#">Bazzow</a>
    <div class="menu"> ... </div>
</li>

Magento hy vọng sẽ chỉ tìm thấy các nav-chuỗi trên <li>các phần tử, nhưng giá trị của thuộc tính dữ liệu của bạn sẽ bị khớp và bị hack. Không muốn.

Vì vậy, sử dụng một lớp và thuộc tính dữ liệu khác nhau như thế nào i-have-a-child-.

Ma

Một người đàn ông thực sự làm cho may mắn của riêng mình, Billy Zane.


1
"Giải thích" vấn đề và giải thích!
Anna Völkl

haha wow điều đó thực sự khá điên rồ ... Trong một mô hình của mô-đun bộ đệm toàn trang ... được nâng cấp
Erfan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.