Sử dụng URL bảo mật dựa trên ngữ cảnh


9

Tôi quen với việc sử dụng các phương pháp khác nhau để tạo URL an toàn dựa trên ngữ cảnh, nghĩa là:

$this->getUrl('my-page', array('_forced_secure' => $this->getRequest()->isSecure()));

Điều này hoạt động rất tốt để xây dựng các liên kết sẽ hướng đến một trang bảo mật trong khi bạn ở chế độ bảo mật (hoặc sẽ chỉ liên kết đến trang không bảo mật nếu không sử dụng chế độ bảo mật).

Vấn đề tôi đang tìm kiếm là Magento chỉ xử lý một vài trang đặc biệt là cần phải bảo mật (tài khoản khách hàng, thanh toán, v.v.). Điều tôi thích là Magento luôn sử dụng một liên kết an toàn nếu người dùng hiện đang ở chế độ bảo mật hoặc sử dụng liên kết không bảo mật nếu người dùng ở chế độ không bảo mật.

Từ những gì tôi có thể nói, lựa chọn thực sự duy nhất của tôi là:

  1. Sửa đổi mọi trường hợp $this->getUrl()tương tự như đoạn trích ở trên.
  2. Đặt không an toàn base_urlđể sử dụng HTTPS, buộc tất cả các trang phải bảo mật.

Có phương pháp nào tốt hơn không liên quan đến việc phải thay đổi mọi cuộc gọi thành $this->getUrl()hoặc buộc tất cả các trang thành HTTPS bất kể bối cảnh của người dùng không?

-- biên tập --

Tôi biết tôi có thể sửa đổi /app/code/core/Mage/Core/Model/Url.php->setRouteParams()phương pháp, mặc dù tôi hy vọng có một cách sạch hơn.

Câu trả lời:


5

Có Magento luôn khớp với giao thức mà người dùng hiện đang sử dụng sẽ gây ra sự cố, chẳng hạn như không đưa ra các URL an toàn đến trang đăng nhập của khách hàng khi trên một URL không bảo mật như trang chủ của trang web.

Những gì tôi khuyên bạn nên làm là thêm một số XML cấu hình vào tệp cấu hình của mô-đun tùy chỉnh để khai báo các tuyến bổ sung mà bạn cần để bảo mật là an toàn. Bạn làm điều này bằng cách có cái này trong tệp config.xml của bạn (thay thế module_or_route_idbằng một cái gì đó độc đáo:

<config>
    <frontend>
        <secure_url>
            <module_or_route_id>/route/</module_or_route_id>
        </secure_url>
    </frontend>
</config>

Nếu bạn xem qua tệp config.xml cho mô-đun Mage_Customer, bạn sẽ thấy một ví dụ về điều này trong đó đường dẫn "/ khách hàng /" đã được xác định là an toàn.

Lưu ý: nếu module_or_route_idphần của ví dụ trên không phải là duy nhất, sẽ chỉ có một định nghĩa được sử dụng, dẫn đến điều gì đó không được bảo mật chính xác. Hãy chắc chắn rằng tên nút là duy nhất. :)

Tuy nhiên, vì đây là đường dẫn, nên tôi không chắc chắn cách này sẽ áp dụng trực tiếp vào URL của các trang nội dung CMS riêng lẻ, vì tất cả chúng vẫn sẽ chia sẻ một tuyến đường / đường dẫn vì nó viết lại tất cả chúng vào cùng một CMS bộ điều khiển.

Nếu bạn thực sự cần toàn bộ trang web để chạy HTTPS, thì bạn sẽ phải sử dụng URL https: // cho cả cài đặt URL cơ sở an toàn và không bảo mật.


Tôi muốn chỉ sửa đổi mô hình URL cốt lõi hơn là bao gồm các tuyến bảo mật bổ sung cho mọi tuyến đường lối vào có thể (đặc biệt là các tuyến đường 'không nhìn thấy' như catalogsearch / ajax / suggest, v.v.). Vâng, đó là một thay đổi cốt lõi, nhưng đó là ba dòng mã bổ sung so với nhiều dòng mã cần thiết để bao quát tất cả các tuyến đường lối vào. Trong tình huống chỉ là một vài tuyến đường bạn muốn thay đổi, đề xuất của bạn có ý nghĩa hơn nhiều.
pspahn

Trước đây, chúng tôi đã sửa đổi Mage_Core_Model_Store::getBaseUrlđể làm cho cửa hàng của chúng tôi luôn an toàn khi được nhúng trong tab Facebook. Mặc dù vậy, có một số thứ khác cần xem xét, chẳng hạn như lưu trữ bộ đệm ẩn bất cứ khi nào nhấn nó trước (bạn sẽ phải thêm một cái gì đó vào khóa bộ đệm). Bạn cũng sẽ có như David nói, các liên kết không an toàn để đăng nhập / thanh toán, hoặc cuối cùng mọi khách hàng đến trang web của bạn đều kết thúc ở chế độ bảo mật nếu họ đăng nhập hoặc nhấn vào thanh toán.
Peter O'Callaghan

1
@pspahn Bạn có nghĩ rằng thiết lập /catalogsearch/đường dẫn là an toàn nên bao gồm mọi thứ phù hợp /catalogsearch/*/*/? Tức là sẽ chỉ cần một quy tắc để làm cho mọi thứ catalogsearchđược an toàn.
davidalger

@Cags đã chỉ ra một cái gì đó tôi đã bỏ lỡ bao gồm trong câu trả lời của tôi và đó là lưu ý về các khóa bộ nhớ cache nếu các URL không nhất quán với nhau, bạn sẽ có các khối được lưu trong bộ nhớ cache làm rối tung các liên kết kết quả.
davidalger

Đó là một điểm tốt về các phím bộ nhớ cache. Có vẻ như cách tốt nhất để đi là chỉ chạy mọi thứ HTTPS.
pspahn

2

Đặt các mục sau trong app/etc/config.xmltệp của bạn :

<?xml version="1.0"?>
<config>
  <frontend>
    <secure_url>
      <all>/</all>
    </secure_url>
  </frontend>
</config>

Điều này hoạt động trong Magento 1.9.1

Nếu người dùng đang sử dụng https, điều này sẽ buộc tất cả các url viết lại thành https.


Thậm chí tốt hơn: Đừng sử dụng config.xml mà là local.xml
Michael

1

Đây là một lựa chọn không phù hợp nhưng quan trọng trong Hệ thống | Cấu hình | Web ~ nơi bạn phải nói "sử dụng url bảo mật ở lối vào" - nếu bạn đặt điều này thành có thì một trang được tải bởi https sẽ sử dụng các liên kết https,

không cần phải viết mã hoặc cung cấp cấu hình bổ sung trong hầu hết các trường hợp

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.