Bắt FormKey đúng


18

Tôi có một trang mà tôi liệt kê các sản phẩm, đó là nó. Đó là loại catalog/view.phtmlbản sao. Chỉ cần bao gồm app/Mage.php.

Trong trang này tôi sử dụng

Mage::getSingleton('core/session')->getFormKey(); 

nhưng nó khác với formKey của trang khác

Tôi đang làm gì sai?

Câu trả lời:


17

Có lẽ không có gì vì chìa khóa hình thức là ngẫu nhiên, vì vậy nó thể khác nhau mỗi lần.

Vì vậy, nó không nên tạo ra sự khác biệt, nhưng cách tốt nhất, làm thế nào bạn nên thêm đầu vào khóa biểu mẫu vào mẫu của bạn, là:

<?php echo $this->getBlockHtml('formkey') ?>

Cập nhật: Tôi phải thừa nhận, tôi đã sai ở một điểm: Khóa biểu mẫu giữ nguyên trong một phiên. Nếu bạn có khóa biểu mẫu khác nhau trên các trang khác nhau, đây có thể là sự cố với bộ đệm toàn trang của bên thứ ba bao gồm khóa biểu mẫu trong bộ đệm (không nên) hoặc khóa biểu mẫu nằm trong khối tùy chỉnh sử dụng khối bộ nhớ cache. Để giải quyết vấn đề sau, tôi đã tìm thấy một giải pháp: Các khối bộ đệm có chứa form_key (tức là nội dung động)


Điều này giả sử để xuất một hình thức đầu vào ẩn? nhưng tôi không thể đưa nó vào bài đánh giá của mình. bất cứ suy nghĩ nào?
wlin

Có và bạn sẽ có thể làm điều đó trong bất kỳ khối nào trên bất kỳ trang nào. getBlockHtml() được triển khai trong Mage_Core_Block_Abstractformkeykhối được xác định trongbase/default/layout/core.xml
Fabian Schmengler

Tôi không thể đưa nó ra đầu ra ngay cả trong một bản in 1.8. nhưng tôi cứng mã này <input type="hidden" name="form_key" value="<?php echo Mage::getSingleton('core/session')->getFormKey(); ?>"/>. Có vẻ để sửa nó, nhưng vẫn bực bội. Có cách nào tốt hơn.
wlin

3
Tại sao khóa biểu mẫu phải khác nhau mỗi lần? Nó sẽ giống nhau cho một phiên nhất định trên bất kỳ trang nào; nó chỉ nên thay đổi bởi các phiên khác nhau.
Nick Rolando

Tôi đồng ý rằng nó không thực sự cần thiết nhưng đây là cách nó hoạt động trong Magento.
Fabian Schmengler

8

Tôi biết câu hỏi mơ hồ này không nên được trả lời. Tuy nhiên tôi có thể gặp phải một vấn đề tương tự ở đây, đây là những gì tôi đã học được:

  • form_key không được khác nhau trong mỗi yêu cầu
  • form_key phù hợp trong suốt phiên
  • một phiên khác sẽ tạo một form_key khác (thử trình duyệt khác)
  • các CACHE TRANG nào đôi khi can thiệp vào đây
  • với tôi điều này dẫn đến một Widget hiển thị cùng một form_key (được lưu trong bộ nhớ cache) cho tất cả các phiên.
    • tôi không có "tính năng" này

Do đó, dựa trên ví dụ ngắn, tôi đã ghi đè hành động thanh toán addtocart như thế này trong Mô-đun mới:

ứng dụng / mã / cục bộ / Tên / Thanh toán / bộ điều khiển / CartContoder.php

<?php
require_once(Mage::getModuleDir('controllers','Mage_Checkout').DS.'CartController.php');

class Name_Checkout_CartController extends Mage_Checkout_CartController
{
    public function addAction()
    {
        $request = $this->getRequest();
        $formKey = Mage::getSingleton('core/session')->getFormKey();
        $request->setParam('form_key', $formKey);
        return parent::addAction();
    }
}

ứng dụng / mã / cục bộ / Tên / Checkout / etc / config.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Name_Checkout>
            <version>0.1.0</version>
        </Name_Checkout>
    </modules>
    <frontend> 
        <routers>
            <checkout> 
                <args>
                    <modules>
                        <name_checkout before="Mage_Checkout">Name_Checkout</name_checkout>
                    </modules>
                </args>
            </checkout>>
        </routers>
    </frontend>
</config>

ứng dụng / etc / mô-đun / Name_Checkout.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Name_Checkout>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_Checkout/>
            </depends>
        </Name_Checkout>
    </modules>
</config>

Tôi hy vọng điều này sẽ đủ rộng rãi để mọi người tái tạo điều này


+1 cho "PACH CACHE đôi khi không can thiệp vào điều này". Đây là trường hợp tại sao tôi không thể thêm sản phẩm vào danh sách mong muốn. Chúng tôi đang sử dụng bộ đệm ẩn trang Varnish và nó đang lưu các khóa biểu mẫu.
Nick Rolando

1

Không thể bình luận vì vậy tôi đang trả lời thay thế. Không thêm khóa biểu mẫu trong bộ điều khiển. Nó vô hiệu hóa các lợi ích bảo mật của khóa mẫu. Nếu bạn đang sử dụng Varnish, bạn có thể sử dụng ESI (Edge Side Bao gồm) để thêm khóa. Bạn sẽ phải lưu nó trong một cookie để nó hoạt động.


Bạn có thể cung cấp một ví dụ về cách hiển thị hướng dẫn ESI của bạn cho khối formkey không?
DarkCowboy

Bạn sẽ có thể có được điều đó từ tiện ích mở rộng Cache Phoenix Medie Varnish. github.com/PHOENIX-MEDIA/Magento-PageCache-powered-by-Varnish
Bjorn Tantau
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.